希爾排序與快速排序

2021-07-14 23:55:16 字數 2563 閱讀 8664

上節講的歸併排序執行速度比簡單排序塊,但是它需要的空間是原始陣列空間的兩倍;通常這是乙個嚴重的缺點

希爾排序,希爾排序的時間複雜度是o(n*(logn)^2)。希爾排序是基於插入排序的。希爾排序又叫縮小增量排序,它是基於插入排序的增強版。

基本思想:把記錄按步長進行分組,對每組記錄採用直接插入的方法進行排序。隨著步長的縮小,所分成的組包含的記錄就越來越多,當步長的值減小到1時

,整個資料合成一組,構成一組有序的記錄,則完成排序。

過程如下圖所示:

具體的執行步驟是:

1,在第一趟排序過程中,我們不妨設gap1=n/2=5,即為相隔距離為5的元素組成一組,可以分為5組。接下來,按照直接插入排序的方法對每個組進行排序。

2,第二趟排序中,我們把上次的gap縮小一半,即為gap2=gap1/2=2(取整數)。這樣每相隔距離為2的元素組成一組,可以分為2組。按照直接插入排序的方法

對每個組進行排序。

3,在第三趟排序中,再次把gap縮小一半,即為gap3=gap2/2=1。這樣相隔距離為1的元素組成一組,即只有一組。按照直接插入排序的演算法對每個組進行排序。此時排序結束。

注意希爾排序是不穩定的排序。

核心**:

public void shellsort(int list)

}gap=gap/2;

}printall(list);

}

毫無疑問,快速排序是最流行的排序演算法,大多是情況下,快速排序都是最快的,執行時間是o(n*logn)級別。它是一種既不浪費空間也不浪費時間的排序演算法。

方法其實很簡單:給乙個序列「6 1 2 7 9 3 4 5 10 8」兩端開始「探測」。以第乙個數作為基準數(6),先從右向左找乙個小於6的數,再從左向右找乙個大於6的數,然後交換他們。這裡可以用兩個變數i和j,分別指向最左邊和最右邊。我們為這兩個變數起乙個好聽的名字「哨兵i」和「哨兵j」。剛開始的時候讓哨兵i指向》序列的最左邊(即為i=0),指向數字6.讓哨兵j指向序列的最右邊(即為i=9),指向數字8.如圖:

首先哨兵j開始出動。因為此處設定的基準數是最左邊的數,所以需要讓哨兵j先出動,這一點非常重要。哨兵j一步一步的向左挪動(即為j--),直到找到乙個小於6的數停下來。接下來哨兵i再一步一步向右挪動(即為i++),直到找到乙個大於6的數停下來。最後哨兵j停在了數字5面前,哨兵i停在了數字7面前。如圖:

現在交換哨兵i和哨兵j所指向的元素的值,交換後的序列如下:

6 1 2 5 9 3 4 7 10 8

到此,第一次交換結束。接下來開始哨兵j繼續向左挪動(注意,每次必須數哨兵j先出發)。他發現了4(比基準數6要小,滿足要求)之後停了下來。哨兵i也繼續向右挪動,他發現了9(比基準數6大,滿足要求)之後停了下來。如下圖:

此時再次進行交換,交換之後的序列如下:

6 1 2 5 4 3 9 7 10 8

第二次交換結束後,「探測」繼續。哨兵j繼續向左挪動,他發現了3(比基準數6小,滿足要求)之後停了下來。哨兵i繼續向右挪動,糟糕!此時哨兵i和哨兵

j相遇,哨兵i和哨兵j都走到了3面前。說明此時「探測」結束。我們將基準數6和3進行交換。如下圖:

交換後的序列如下:

3 1 2 5 4 6 9 7 10 8

此時,第一輪「探測結束」。此時以基準數6為分界點,6左邊的數小雨等於6,6右邊的數大於等於6.

將以6為分界點的兩個子串行:3 1 2 5 4和9 7 10 8再次進行快速排序.整個圖的處理過程如下圖所示:

注意:快速排序的最差時間複雜度為o(n^2),它的平均複雜度為o(nlogn),它是基於「二分」的思想。

**實現:

public void quicksort(int n,int left,int right)

}public void partion(int n,int left,int right)

if(left靜默虛空、

坐在馬桶上看演算法:快速排序

希爾排序,堆排序,快速排序

插入排序的改進演算法,不穩定的排序演算法,空間複雜度為o 1 public static void shellsort int a 氣泡排序的改進演算法,不穩定的排序演算法 空間複雜度在o log2n 和o n 之間 時間複雜度在o n 和o n2 之間,平均時間複雜度為o nlog2n 而當陣列初...

希爾排序,快速排序,堆排序

最近在準備資料結構的考試,於是用部落格記錄下自己複習的過程。今天的內容是三種高階排序。希爾排序 當序列增量為incr k 2 t k 1 1時,時間複雜度為o n1.5 以序列增量分組,對每組進行大小調整。templatevoid shellinsert t elem,int n,int incr ...

希爾排序,堆排序,快速排序

希爾排序 最優情況下 時間複雜度為 o n 1.3 最差的情況下為 o n 2 增量序列的最後乙個增量值必須等於1 shell sort vector v1 堆排序 void heapadjust int a,int m,int n for i n i 1 i 快速排序 快排在樞紐選取時可以優化,三...