堆排序的思想借助了二叉排序樹,時間複雜度:o(nlgn),空間複雜度o(n)。
首先需要構建堆,堆分為大頂堆和小頂堆,如果是大頂堆,任意乙個元素,滿足arr[i] >=arr[2*i +1] && arr[i] >=arr[2*i+2];小頂堆滿足arr[i] <=arr[2*i+1] && arr[i] <= arr[2*i+2];
堆本質上是乙個完全二叉樹,所以構建堆的時候,可以借助二叉樹遞迴構建辦法,構建堆的**有:
private void buildminheap(int arr, int size, int index)
// 右孩子小,調整右孩子
if(right < size && arr[right] <= arr[min])
// 表示有調整,需要交換孩子與父節點的位置
if(min != index)
}
構建大頂堆,則在比較的時候相反就行
private void buildmaxheap(int arr, int size, int index)
if(right < size && arr[right] >= arr[max])
if(max != index)
}
用堆排序的基本思想:
構建完堆以後, 開始做排序。因為堆頂元素具有特殊性(最大或者最小),所以第一次比較用陣列最後一位,與堆頂元素比較,可以確定最後一位是有序的;然後調整堆,用倒數第二位與堆頂元素比較,得到倒數第二位和最後一位構成乙個有序的陣列;依次迴圈,直到陣列元素第乙個比較完成。
在構建堆的時候,因為左右孩子是2倍關係,所以調整堆只需要陣列長度的一半遍歷就行。
public static void main(string args) ;
for(int i = arr.length/2 -1; i>=0; i--)
for(int i = arr.length-1; i > 0; i--)
}
大頂堆排序
利用大頂堆排序 自己建立堆!大頂堆 include using namespace std 交換陣列中兩個數的函式 void swap int arr,int i,int j heapify的過程 void heapify int tree,int n,int i void build heap i...
堆排序(大頂堆)
ifndef maxheap define maxheap includeusing namespace std const int capacity 100 class maxheap void push const int data void initialize int a,int thesi...
堆排序之 大頂堆
堆的定義 設有n個元素的序列 1 2 解釋 如果讓滿足以上條件的元素序列 建堆的步驟 從最後乙個非終端結點開始往前逐步調整,讓每個雙親大於 或小於 子女,直到根節點為止。注意 終端結點 即葉子 沒有任何子女,無需單獨調整。建堆的具體做法 1 將原始序列轉換成完全二叉樹。2 從序號最大的非葉子節點開始...