資料結構(堆排序和歸併排序)

2021-08-11 10:23:36 字數 1113 閱讀 2442

堆排序

在直接選擇排序中,順序表是乙個線性結構,要從有n個記錄的順序表中選擇出乙個最小的記錄需要比較n-1 次。如能把待排序的n個記錄構成乙個完全二叉樹結構,則每次選擇出乙個最大(或最小)的記錄比較的次數就是完全二叉樹的高度,即log2n次,則排序演算法的時間複雜度就是o(nlog2n)。這就是堆排序(heap sort)的基本思想。

堆排序中的堆分為最大堆和最小堆,最大堆的定義如下:

設順序表 sqlist 中存放了 n 個記錄,對於任意的 i(0≤i≤n-1),如果 2i+1

public

void createheap(list list,int low,int high)

if (temp < list[j])//如果需要交換位置

else

}list[k]=temp;//避免重複賦值}}

public

void heapsort(list list)

}

堆排序演算法是基於完全二叉樹的排序方法。把一棵完全二叉樹調整為堆,以及每次堆頂記錄交換後進行調整的時間複雜度均為o(nlog2n),所以,堆排序演算法的時間複雜度為o(nlog2n)。

歸併排序

歸併排序(merge sort)主要是二路歸併排序。二路歸併排序的基本思想是:將兩個有序表合併為乙個有序表。

假設順序表 sqlist 中的 n 個記錄為 n 個長度為 1 的有序表,從第 1 個有序表開始,把相鄰的兩個有序錶兩兩進行合併成乙個有序表,得到 n/2 個長度為 2的有序表。如此重複,最後得到乙個長度為 n 的有序表。

public

void merge(list list,int len)

else

}while (i<=h1)

while (j<=h2)

l1 = h2 + 1;

}i = l1;

while (ifor (int k = 0; k < list.count; k++)

}public

void mergesort(list list)

}

二路歸併排序的時間複雜度為o(nlog2n)。

歸併排序和堆排序

歸併排序的演算法我們通常用遞迴實現,先把待排序區間 s,t 以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸併操作合併成有序的區間 s,t 桶排序法,非常耗空間。規定陣列中元素的最大值不超過陣列的長度,否則要先求出陣列元素的最大值後,才能指定空桶的個數,要求待排序陣...

堆排序和歸併排序

極少涉及,在此就不再研究 了!堆排序 原理 把待排序的元素按照大小在二叉樹位置上排列,排序好的元素要滿足 父節點的元素要大於等於子節點 這個過程叫做堆化過程,如果根節點存放的是最大的數,則叫做大根堆,如果是最小的數,則叫做小根堆,可以把根節點拿出來,然後再堆化,迴圈到最後乙個節點。時間複雜度 平均 ...

基礎資料結構演算法 快速排序,堆排序,歸併排序

還是把基礎資料結構複習一下吧,演算法雖然簡單,但是想把後面的思想完全領悟還是比較困難的。這個是排序的三件套,快速排序,堆排序,歸併排序。快速排序 以第乙個數為支點,把比他小的放前面,比他大的放後面。完成這一步需要在乙個大迴圈裡巢狀兩個並列的小迴圈。大迴圈控制是否結束,第乙個小迴圈控制把小數往前移,第...