插入排序及其優化

2021-09-25 15:42:06 字數 1363 閱讀 9653

插入排序

直接插入排序

時間複雜度為o(n^2)穩定的排序元素移動是順序的

在乙個陣列中,將第乙個元素看作排序元素序列裡的唯一元素,然後用臨時變數tmp首先存放第二元素,即可在陣列中空第二個元素位置(即此位置可被覆蓋),

將第二個元素與有序序列裡面唯一乙個元素進行比較,根據排序條件決定元素是否需要向後移動,然後有序序列元素加一,申請空間裡面存放將要插進有序序列裡面的元素;

void insertsort(int arr, int start, int end)

arr[j + 1] = tmp;

}}優化一:折半插入排序(binary insertion sort)是對插入排序演算法的一種改進,所謂排序演算法過程,就是不斷的依次將元素插入前面已排好序的序列中,在尋找插入點時採用了折半查詢。時間複雜度:o(n^2),穩定性:穩定。

排序思想:有一組資料待排序,排序區間為array[0]~array[n-1]。將資料分為有序資料和無序資料,第一次排序時預設array[0]為有序資料,array[1]~array[n-1]為無序資料。有序資料分割槽的第乙個元素位置為low,最後乙個元素的位置為high。

遍歷無序區間的所有元素,每次取無序區間的第乙個元素array[i],因為0~i-1是有序排列的,所以用中點m將其平分為兩部分,然後將待排序資料同中間位置為m的資料進行比較,若待排序資料較大,則low~m-1分割槽的資料都比待排序資料小,反之,若待排序資料較小,則m+1~high分割槽的資料都比 待排序資料大,此時將low或high重新定義為新的合適分割槽的邊界,對新的小分割槽重複上面操作。直到low和high 的前後順序改變,此時high+1所處位置為待排序資料的合適位置。

void binary_insert_sort(int arr, int len)

for (j = i-1; j>=high+1; j--)

arr[j+1] = arr[j];

}arr[j+1] = temp;

}優化二:希爾排序法是對直接插入排序法的優化,通過設定乙個增量,對原始序列進行分組,對每組用直接插入排序法排序再整合,再縮小增量,周而復始直至增量為1,完成排序,因此又叫「縮小增量排序法」。

其實到希爾演算法進行到最後,n的值變為1(即增量或者稱跳躍數變為1)的時候,它就是直接插入排序,只不過這時候,整個序列基本上是有序的,需要交換的資料已經非常少了,提高效率。

void swap(int & a,int & b)

void shellsort(int a,int l,int h)

a[j+d] = tmp;}}

}}

希爾排序增量d的變化,直至變為1

插入排序及其優化

插入排序 把乙個無序的陣列分為兩部分,一部分為有序 剛開始只有乙個元素 一部分為無序 從第二個元素開始 將無序元素乙個乙個插入到有序元素中。void insertsort int arr,size t size arr j x 直接插入排序耗時的操作有 比較 後移賦值。時間複雜度如下 1 最好情況 ...

插入排序及其優化

複雜度o n 2 用筆模擬過程可輕鬆得出 一 思路 index 0 1 2 3 4 5 value 4 3 2 6 4 8 1 選定起始指標index 0,此時已排好順序的子陣列長度為1 就是list 0 4 2 指標後移,候選元素變為list 1 3,將該元素不斷向左交換到某個位置,使得list ...

插入排序優化

插入排序的是十分常見的o n 2 級別的排序演算法,其排序思路如下 一次迴圈使前n個數都為有序,巢狀的二次迴圈將第n個數插入到前n個數中合適的位置,我的實現 如下 public void insertsort int a,int n else 這個插入排序相對於選擇排序有可以提前結束一層迴圈的特點,...