促其長談之插入排序和希爾排序

2021-08-09 17:59:23 字數 1165 閱讀 7668

說到排序,大家一下想起的一般都是什麼快排,冒泡,往往很少想到插入排序和希爾排序,那麼今天我們就來說說這兩個排序吧

顧名思義,插入排序就是在乙個預設已經有序的一組數中插入乙個數,插入之後,還要使得整個數列有序,這就是插入排序的基本思想,至於實現我們現在來說一下。

void swap(int &a,int &b)

void insert_sort(int arr,int len)

arr[j+1]=tmp;}}

對著**說可能能好說一點

首先,我們還是得遍歷一遍陣列,注意一點就是,我們預設第乙個數是有序的,然後遍歷從1開始後面的陣列,當找到乙個數比tmp中的數大時,就進行交換,則前面的預設序列還是有序的,然後i又從2開始往後走,和前面的思想都是一樣的。(這裡的交換函式沒有用到臨時空間)

然後我們在說說這個排序的穩定性,這是乙個穩定的排序,最好時間複雜度是o(n),最壞時間複雜度是o(n*n),我想大家都應該能理解。好的我們接下來來說一下希爾排序。

接下來我們來說一下希爾排序,希爾排序的思想是將數列分成若干個陣列,然後再在這些陣列中進行插入排序,然後再縮小增量來分組,然後再進行排序,最後增量很小的時候,再進行一次插入排序即可。

假如我們排這些數:

10/2=5,所以我們就分5組吧

分完組後,我們得到的序列變成了1,-4,2,0,66,90,321,54,658,765,好,接下來我們再縮小增量 5/2=2,所以分成2組,如圖

再將這兩個陣列分別用插入排序排好,

再寫成陣列的樣子 1,-4,2,0,66,54,321,90,658,765

然後最後進行一次插入排序就ok了!

下面我就給出**的是實現:

void shellsort(int *arr,int arr_len,int dk)

arr[j+dk]=tmp;}}

void sort(int *arr,int *brr,int arr_len,int brr_len)

}這是一種比較好理解的方法,但還有更簡單的**

void swap(int *a,int *b)

void shellsort(int a, int n)

以上就是所說的直接插入和希爾排序,但希爾排序卻是不穩定的一種排序,它的時間複雜度是最好情況下o(n),最壞時間複雜度是o(n*n);但比較難記的是他的平均時間複雜度是o(n^1.3),這裡是n的1.3次方。

插入排序之希爾排序

希爾排序也屬於插入類排序演算法。希爾排序通過縮小增量,將待排序元素劃分為若干個子串行,分別對各個子串行按照直接按照插入排序演算法進行排序。當增量為1時,待排序元素構成乙個子串行,對該序列排序完畢後希爾排序演算法結束。如下 include void shellsort int a,int length...

插入排序之希爾排序

直接插入排序與希爾排序相比還是有一些問題的。結論 當需要插入的數是比較小的數時,後移的次數明顯增多,對效率有影響。1 交換法 test public void testsort long start system.currenttimemillis bubblesorting array 氣泡排序排...

插入排序和希爾排序

插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料,演算法適用於少量資料的排序,插入排序的基本思想是 每步將乙個待排序的紀錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。public static void sortins...