C 插入演算法及二分插入演算法

2021-06-12 16:09:58 字數 1404 閱讀 4872

一、直接插入演算法

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.特點分析 二分法...