希爾排序 堆排序 歸併排序

2022-06-27 09:45:10 字數 2518 閱讀 3080

希爾排序(by donald shell):

//利用了插入排序的簡單 ,同時克服 插入排序以此交換消去乙個 逆序對的困難.

既然我們 決定 要 做上述之事   那麼我們  最迫切的事情就是  確定我們以此交換 間隔幾個位置?

假定給了乙個需要排序的陣列並且 按照5-間隔的方式進行排序  附圖如下

我們  慢慢的按照 越來越小的間隔開始去排序      (最後只能是間隔為1).

阿呆說  增量元素不互質  ,則最小增量可能根本不起作用    .會導致 很糟糕的時間複雜度,所以  會造成  n^2的時間複雜度 .(和插入排序一樣.)   (講插入排序的作用  目前就是 給希爾排序做鋪墊.)

所以為了解決上述問題我們就引入乙個hibbard增量序列  dk=2^k-1   相鄰元素互質   最壞情況t=(n ^3/2)

堆排序:

先回顧一下插入排序

void selection_sort ( elementtype a, int

n )}

雷迪森 按的 箭頭們  有沒有想到 堆排序?如果這樣做的話  我們就開啟了乙個堆排序....

void heap_sort(element a,int

n)

for(i=0;i)

} //

整體時間複雜度有 nlogn

下面 開始避免上面出現的問題.

我們可以將上述的最小堆調整成最大堆.     (附上乙個堆排序的題目,和堆排序做出來的答案)

//由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。

1void heap_sort(elementtype a,intn)2

10}11//

定理:堆排序處理n個不同元素的隨機排列的平均次數是 2n log n - n log log n

12//

雖然堆排序給出最佳平均時間複雜度

,但實際效果不如用sedgewick增量序列的希爾排序.

下面附上乙個 

第一步              這是將已經有序的 兩個序列歸併在一起. 

/*

l = 左邊起始位置, r = 右邊起始位置, rightend = 置 右邊終點位置

*/void merge( elementtype a, elementtype tmpa,int l, int r, int

rightend )

while( l <= leftend ) /*

的 直接複製左邊剩下的

*/tmpa[tmp++] = a[l++];

while( r <= rightend ) /*

的 直接複製右邊剩下的

*/tmpa[tmp++] = a[r++];

for( i = 0; i < numelements; i++, rightend --)

a[rightend] =tmpa[rightend];

}

第二步下面是分而治之    

這是  分而治之 講乙個很長的待排序列  劃分為很小  遞迴的去解決  

void msort(elementtype a,elementtype tmpa,int l,int

rightend)

}

第三步   統一函式介面  

void merge_sort(elementtype  a,int

n)

else

error (

"空間不足\n");

}

----------話說遞迴都不是太好用---下面附上非遞迴演算法----這才是重要的.--   下面附上  非遞迴演算法的思想

臨時陣列需要用多少容量(假設  待排序陣列的容量為 n )----------答案有一種很大   就不說了

另一種就是開乙個和 原先陣列一樣大的 , 陣列去  解決問題.

void merge_sort(elementtype  a,int

n) free(tmpa);

}else

error (

"空間不足.\n");

}

歸併排序 在  外排序時用的比較多   內排序時  沒什麼人用 .

希爾排序,堆排序,歸併排序

思想 1 在直接插入排序的思想上,如果先使陣列盡可能有序,則就可使時間複雜度趨近o n 因此,演算法也集中在使陣列有序。首先用分組的方法將陣列分組,這裡舉例假設陣列有11個數,我們可以分為3個為1組,再1個為1組。2 給定乙個陣列分組的寬度,則外層迴圈就可直接從i 0 width開始,並用tmp儲存...

幾種排序,希爾排序,快速排序,堆排序,歸併排序

因為最近看了一點stl,所以用vector代替了陣列,從別的地方借鑑了很多,只是簡單的實現,也沒有做什麼優化,其實也不會 include include includeusing namespace std void print vectorv swap v left v high quick so...

氣泡排序,插入排序,堆排序,歸併排序,希爾排序

感謝姥姥提供模板 感謝姥姥 展示 include include using namespace std 氣泡排序 void bubble sort int arr,int n 插入排序 void insertionsort int arr,int n arr i tmp 希爾排序 void she...