堆排序只需要乙個記錄大小的輔助空間,每個待排序的記錄僅占有乙個儲存空間。
在處理堆排序時面臨兩個問題:乙個是如何建堆。另乙個是如何在輸出堆頂後進行調整,成為乙個新堆。
建堆的過程主要是通過在n/2(取下限)處開始,反覆進行「篩選」的過程。具體過程見演算法分析及注釋。
//堆排序的偽**
//heapsort(data)
// data轉變成乙個堆;
// for i = data.length-1 downto 2
// 將根和i位置上的元素交換;
// 恢復樹data[0],...,data[i-1]的堆屬性;
public class heapsort
}//將乙個陣列建立成乙個堆(根元素沿著樹向下移動的演算法實現)
void movedown(object data, int first, int last)
else
//不滿足堆的迴圈時,退出迴圈
largest = last + 1;}}
//實現陣列中兩個元素的交換
void swap(object a, int e1, int e2)
}堆排序在建堆的過程中heapsort()使用movedown(),共執行o(n)步。第二步在調整的過程中是對logi在1到(n-1)上的和,即o(nlogn)。
在最好的情況下,堆排序比較的總次數為o(n)。
排序演算法 堆排
堆排序 如果將堆結構中的資料看作是一顆完全二叉樹的各個節點,那麼堆的性質就是滿足如下性質的完全二叉樹 樹中任意非葉子節點的關鍵碼均不大於或不小於其左右孩子節點的關鍵碼。利用堆的有序性及其運算,可以容易的實現選擇排序的方法稱為堆排序。假設欲對含有n個物件的序列v 0 v 1 v n 1 進行堆排序,演...
Java實現 高效排序演算法之基數排序
1 基數排序是一種借助多關鍵字排序的思想對單邏輯關鍵字進行排序的方法。2 演算法的偽 和排序方法如下所示 其中方法是實現對整數的排序方式 基數排序的偽 radixsort for d 1 to 最長數字的最左邊數字所在的位置 根據第d位數字將所有的數字分別分配到堆0至堆9中 將所有證書放進乙個陣列中...
《基礎演算法之排序》 4 堆排序 java實現
對於堆排序,首先要了解堆的概念,堆分為大頂堆和小頂堆。顧名思義,大頂堆的堆頂元素為整個堆的最大值 小頂堆的堆頂元素為整個堆的最小值。對於本題的堆排序,採用的是大頂堆。堆排序主要分為兩部分,建堆和調整堆。建堆的過程就是遍歷要排序的陣列中的每乙個元素,然後依次放入大頂堆,並比較大小,找到每個元素的位置,...