內部排序之插入排序 希爾排序

2021-06-27 15:08:03 字數 1351 閱讀 3234

插入排序(insertion sort)

插入排序由n-1趟(pass)排序組成,對於p = 1趟到p = n-1趟,插入排序可以保證從位置零到位置p上的元素全部有序,有這樣乙個事實:1、當插入p位置(設為data)的時候,從0位置到p-1已全部有序,如果data比p-1位置上的元素大,那麼直接放在p位置即可;2、當data比p-1位置的小的時候,那麼繼續向前比較,直至找到某個元素使得data大於等於它,那麼把data插入其後即可!

由於插入排序是一般都是利用陣列來實現,那麼比較以及插入,要涉及到移位,使得它的複雜度(o(n^2));

說明一下,由於碰到某個元素等於待插入元素的值時,插入其後,因此相對原來陣列,元素的前後的相對位置沒有改變,因此它是一種穩定的排序:

#include #include #include using namespace std;

void insert_sort(int arr, int n)

}int main()

return 0;

}

希爾排序:

希爾排序又稱之為:縮小增量排序(diminishing increment sort);希爾排序首先先擇乙個增量序列h1,h1, h3.....hk;只要保證h1 = 1,任何增量序列都是可以的(一般我們都是用hk = n/2或者hk = (n+1)/2)。

希爾排序在使用增量為hk的一趟排序之後,使得對於每乙個i都有arr[i] <= arr[i+hk],這表明所有相隔為hk的元素都排序了,當增量為h1時,所有相鄰元素都是有序的,由此可以保證希爾排序的正確性!由於希爾排序的增量序列的選取不定,其時間複雜度也是不確定的!

另外希爾排序是不穩定的!因為前面的各趟排序結果,可能會被後面的各趟排序打亂,相同元素的相對位置會發生變化。

#include #include #include using namespace std;

const int maxn = 110;

void shell_sort(int arr, int n)

}}int main()

{ int arr[maxn], n;

while(~scanf("%d", &n))

{if(n == 0)

break;

for(int i = 0; i < n; ++i)

scanf("%d", &arr[i]);

shell_sort(arr, n);

for(int i = 0; i < n; ++i)

cout << arr[i] <<" ";

cout<

內部排序 插入排序 希爾排序

希爾排序將要排序的數值按照某個間隔分成數個數列集合,再對各個數列集合進行插入式排序,重複進行數列分割,每次分割的長度縮小為上一次分割長度的一半,直到分割間隔為0,此時排序完成。直接上code吧 include stdafx.h include include include void shell s...

插入排序之希爾排序

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

插入排序之希爾排序

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