八大排序演算法 堆排序

2021-07-28 10:33:08 字數 2003 閱讀 7817

排序,分為內部排序和外部排序,內部排序是指將資料記錄在記憶體中進行排序,而外部排序因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存,所以稱之為外部排序,我們這裡講的八大排序全部屬於內部排序。

堆排序(heapsort)是指利用堆積樹(堆)這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即a[parent[i]] >= a[i]。在陣列的非降序排序中,需要使用的就是大根堆,因為根據大根堆的要求可知,最大的值一定在堆頂。這裡要注意的是堆排序採用的是完全二叉樹的思想,但它的儲存結構採用的是陣列。

堆排序的過程(大根堆)

堆排序:可以看到,上面的調整堆演算法迴圈呼叫執行完畢以後,結果是乙個大根堆,堆排序所要做的就是將堆頂元素20與最後乙個元素3互換位置,即將a[0]與a[n-1]互換位置,換位置之後a[0]至a[n-2]元素又組成乙個新的堆,這時的調整堆與第一次調整剛好相反,它是從堆頂元素開始調整,一直往下延伸,是乙個純遞迴的過程,具體過程如下:

到這裡,排序就算是執行完了,從上述過程可知,堆排序其實也是一種選擇排序,是一種樹形選擇排序。只不過直接選擇排序中,為了從a[1…n]中選擇最大記錄,需比較n-1次,然後從a[1…n-2]中選擇最大記錄需比較n-2次。事實上這n-2次比較中有很多已經在前面的n-1次比較中已經做過,而樹形選擇排序恰好利用樹形的特點儲存了部分前面的比較結果,因此可以減少比較次數,這就是為什麼第一次調整堆是從下往上,而之後都是從上往下。對於n個關鍵字序列,最壞情況下每個節點需比較log2(n)次,因此其最壞情況下時間複雜度為nlogn。堆排序為不穩定排序,不適合記錄較少的排序。下面是堆排序的c語言實現:

#include

#include

#include

//堆調整演算法

void heapadjust(int num,int i,int length)

//判斷num[2*(i+1)]是否在堆內,若在,判斷其是否大於num[max],若大於,將其下標2*(i+1)賦予給max

if((2*(i+1))2*(i+1)]>num[max])

//若i不等於max,則說明以num[i]為根的最小堆中num[max]是最大值,將num[max]與根結點num[i]交換位置

if(i!=max)

}}//堆排序演算法

void heapsort(int num,int length)

}int main()

; heapsort(num,sizeof(num)/sizeof(int));

for(i=0;i

printf("\n");

}

八大排序 堆排序

堆排序 利用大頂堆 小頂堆 堆頂記錄的是最大關鍵字 最小關鍵字 這一特性,使得每次從無序中選擇最大記錄 最小記錄 變得簡單。其基本思想為 大頂堆 1 將初始待排序關鍵字序列 r1,r2 rn 構建成大頂堆,此堆為初始的無須區 2 將堆頂元素r 1 與最後乙個元素r n 交換,此時得到新的無序區 r1...

八大排序之堆排序

public class heapsort heapsort num,num.length for int i 0 i 0 i heapadjust array,i,length 從最後乙個元素開始對序列進行調整,不斷的縮小調整的範圍直到第乙個元素 for i length 1 i 0 i priv...

八大排序之堆排序

public static void heapsort int arr for int i 0 i arr.length i int size arr.length 堆中用size表示長度 swap arr,0,size while size 0 用 3 0 1 5 2 畫圖,過程清晰。陣列最後插入...