資料來自 靜默虛空 萬分感謝 做筆記用
(1)根據初始陣列去構造初始堆(構建乙個完全二叉樹,保證所有的父結點都比它的孩子結點數值大)。
(2)每次交換第乙個和最後乙個元素,輸出最後乙個元素(最大值),然後把剩下元素重新調整為大根堆。
設有乙個無序序列
構建初始堆
完整的堆排序處理:
// 如果父結點的值已經大於孩子結點的值,則直接結束
if (rootvalue >= array[childindex])
break;
// 把孩子結點的值賦給父結點
array[rootindex] = array[childindex];
// 選取孩子結點的左孩子根結點,繼續向下篩選
// 重點 繼續往下比較
rootindex = childindex;
childindex = 2 * childindex + 1;
}array[rootindex] = rootvalue;
}public
void heapsort(int list)
//上個迴圈的目的是找到大根堆
system.out.println("-------------分割線 -----------------");
// 進行n-1次迴圈,完成排序
for (int i = list.length - 1; i > 0; i--)
}// 列印序列
public
void printpart(int list, int begin, int end)
for (int i = begin; i <= end; i++)
system.out.println();
}public
static
void main(string args) ;
// 呼叫快速排序方法
heapsort heap = new heapsort();
// system.out.print("排序前:\t");
// heap.printpart(array, 0, array.length - 1);
heap.heapsort(array);
// system.out.print("排序後:\t");
// heap.printpart(array, 0, array.length - 1);}}
堆排序學習
參考博主dreamcatcher cx 這位博主還有許多優秀的排序方法學習記錄 構建n次最大堆,每次構建頂點元素即為陣列最大元素,找到最大元素之後將最大元素放在陣列最後 從最後乙個非葉子節點開始,將該節點調整最低階節點,也即它的小於父節點大於兩個子節點 調整次數為n 2 1 完成最大堆的構建之後,將...
堆排序學習筆記
參考此文的學習筆記 不用交換,則已經是最大堆,不用迴圈了 else break void sort int a,int length 開始排序,排序是從上到下從左到右的調整 for int j length 1 j 0 j int main sort a,length for int i 0 i l...
堆排序詳細學習
首先要明白堆是基於二叉樹而言的,堆是二叉樹的一種形式。並且堆是完全二叉樹,具有完全二叉樹的特點。堆只有2種 大頂堆和小頂堆。大頂堆 就是根節點大於子節點,小頂堆反之。下面上圖 一棵完全二叉樹如何才能轉換成乙個堆呢?把握好堆的特點 大頂堆的根永遠大於左右孩子,那麼只需要把每乙個子樹中的左右孩子的較大值...