一、直接插入演算法
1) 思路:對於乙個給定的有n個元素的序列,
1. 我們從第一元素(i=1)開始作為乙個關鍵字,此關鍵字左邊的元素為已經排好序,
2. 把關鍵字插入到左邊排好序的序列中,方法為:把關鍵字其左邊的序列的每個元素從左到右逐個比較,當序列中的元素比關鍵字大時向後移動乙個位置,直到找到比關鍵字小的元素時,將關鍵字插入到其後乙個位置
3. 把i+1作為關鍵字重複2步驟,直到i+1>=n時終止
2)偽**:
insertion-sort(a)
forj← 2tolength[a]
dokey← a[j]
注釋:insert a[j] into the sorted sequence a[1..j-1].
i← j-1
whilei>0 and a [i] >key
doa [i+1] ← a [i]
i ← i-1
a[i+1] ← key
3)c++**:
void insert_sort(int* arr, int num)
int i,j,key;
for(i=1; ikey = arr[i]; j = i-1;
while(j>=0 && key < arr[j])
arr[j+1] = arr[j]; --j;
arr[j+1] = key;
4) 時間代價 最壞時間代價:o(n^2) 最優時間代價o(n)
二、二分插入排序演算法
特點:在直接插入排序的基礎上減少比較的次數,即在插入ri個元素的時候採用二分法比較查詢插入位置,便得二分查詢插入排序法
限制:必須為順序儲存方式
**:void bininsert_sort(int * arr, int num)
int i, j, left, mid, right;
int key;
for(i = 1; i < num; ++i)
key = arr[i];
left = 0 ; right = i-1;
while(left <= right)
mid = (left+right)/2;
if (key < arr[mid]) right = mid -1;
else left = mid+1;
for (j=i-1; j>=left; --j)
arr[j+1] = arr[j];
if (left != i) arr[left] = key;
二分插入 bisect
在乙個有序序列 從小到大 中查詢乙個元素 每次將元素與序列中間位置的元素進行比較 如果大於中點,則在後半段。如果小於中點,則在前半段。以此類推 時間複雜度為o logn 有乙個無序序列 37,99,73,48,47,40,40,25,99,51 對其先排序輸出新列表。分別插入20 40 41 100...
內部排序演算法之五 二分插入演算法
1.1.基本描述 元素個數為n的陣列,需要按照由小到大的順序進行元素排序。1.2.演算法分析 二分插入排序的基本思想 將陣列看成已排序與未排序兩個部分,依次將未排序的元素插入到已排序部分的合適位置,插入新元素需要將插入位置之後的元素依次後移 作為直接插入排序演算法的優化,在需排序元素個數n較大時,二...
常見排序演算法之二分插入排序演算法
1.演算法思路 是在插入第i個元素時 i前面的元素必定是有序的 對前面的0 i 1元素進行折半,先跟他們中間的那個元素比,如果小,則對前半再進行折半,否則對後半進行折半,直到left right,然後再把第i個元素前1位與目標位置之間的所有元素後移,再把第i個元素放在目標位置上。2.特點分析 二分法...