堆排序:堆是指每個節點值大於/小於其左右節點值的完全二叉樹,根節點一定是堆的所有節點中最大/小節點所在處
。節點值大於左右節點值的堆叫大頂堆,根元素為整個堆的最大值。節點值小於左右節點值的堆
叫小頂堆。
堆排序過程:
1、將無序陣列構建成堆結構。
2、將根節點值與最後乙個節點值互換,此時最後乙個節點值最大
3、將剩下的n-1個節點重新構造為堆結構,繼續步驟2,3,直至陣列有序
堆排序是基於完全二叉樹的資料結構,在堆排序的過程中會用到一些完全二叉樹的性質,如下:(以下n均為節點個數)。
2i > n,則i節點沒有左子樹,2i + 1 > n,則i節點沒有有子樹。i從1開始算。
在完全二叉樹中,最後
乙個非葉子節點的是
第(n-1)/2個節點,此為完全二叉樹的性質,自己尚未驗證。但是陣列的下標是從0開始的,所以最後乙個非葉子節點的
下標為(n-1-1)/2 = n/2 -1,n為陣列長度。
此**建立的是大堆,得到公升序結果,從
最後乙個非葉子節點開始調整。
public class heapsort
return arr;
}/**
* @desc 構建初始堆
* @param arr
* @return
*/public static int init(int arr)
return arr;
}/**
* @desc 將當前節點i與其所有子樹調整為堆結構
* @param arr 待調整陣列
* @param i 當前節點
* @param length 陣列長度
* @return
*/public static int adjustheap(int arr,int i,int length)
//將左右節點的較大者與父節點比較,若arr[larger]更大,將arr[larger]上移到i位置,也就是當前的父節點位置
//將父節點位置指向larger,注意此時並沒有將父節點的值放到larger,因為經過調整後,larger之後的元素可能不滿足堆結構
//所以還要進一步判斷找到父節點的最終位置,只是將父節點的位置暫時指向了larger
if (arr[larger] > temp)else
}arr[i] = temp;
return arr;
}}
堆排序是一種選擇排序,整體主要由構建初始堆+交換堆頂元素和末尾元素並重建堆兩部分組成。其中構建初始堆經推導複雜度為o(n),在交換並重建堆的過程中,需交換n-1次,而重建堆的過程中,根據完全二叉樹的性質,[log2(n-1),log2(n-2)...1]逐步遞減,近似為nlogn。所以堆排序時間複雜度一般認為就是o(nlogn)級。
參考:
排序演算法二 堆排序
堆排序的時間複雜度為 o nlgn def max heapify lst,start,end 建立最大堆 root start while true child 2 root 1 左孩子 if child end break if child 1 end and lst child child 1...
演算法二 堆排序
堆排序,其複雜的為nlog n include using namespace std 交換陣列下標為i,j的元素 void swap int tree,int i,int j 堆化,將陣列轉化為大頂堆 如 4,10,3 10,4,3 如果i節點進行了交換,為保證陣列的整個堆結構,必須對交換的節點繼...
排序二 堆排序
子結點的鍵值或索引總是小於 或者大於 它的父節點。堆通過一維陣列實現。在起始陣列為 0 的情形中 父節點i的左子節點在位置 2 i 1 父節點i的右子節點在位置 2 i 2 子節點i的父節點在位置 floor i 1 2 堆中的最大值總是位於根節點。堆中定義以下幾種操作 1 最大堆調整 max he...