堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質:
key[i]<=key[2i+1]&&key[i]<=key[2i+2]或者key[i]>=key[2i+1]&&key>=key[2i+2]
即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字。
堆分為大頂堆和小頂堆,滿足key[i]>=key[2i+1]&&key>=key[2i+2]稱為大頂堆,滿足 key[i]<=key[2i+1]&&key[i]<=key[2i+2]稱為小頂堆。由上述性質可知大頂堆的堆頂的關鍵字肯定是所有關鍵字中最大的,小頂堆的堆頂的關鍵字是所有關鍵字中最小的。
堆排序的基本思想是對一組待排序記錄的關鍵字,首先按堆的定義排成乙個序列(即建立初始堆),從而可以輸入堆頂的最大關鍵字(對於大頂堆而言),然後將剩餘的關鍵字再調整成新堆,便得到次大的關鍵字,如此返回,直到全部關鍵字排成有序序列為止。
/// /// 堆排序
/// 思想:根據初始陣列去構造初始堆(構建乙個完全二叉樹,保證所有的父結點都比它的孩子結點數值大)。
/// 每次交換第乙個和最後乙個元素,輸出最後乙個元素(最大值),然後把剩下元素重新調整為大根堆。
///
/// ///
private int heapsort(int arrdata)
// 進行n-1次迴圈,完成排序
for (int i = arrdata.length - 1; i > 0; i--)
return arrdata;
}/// /// 建堆、調整堆[大頂堆]
///
/// 陣列
/// 父節點
/// 長度
private void heapadjust(int arrdata, int parent, int length)
// 如果父結點的值已經大於孩子結點的值,則直接結束
if (temp >= arrdata[child])
break;
// 把孩子結點的值賦給父結點
arrdata[parent] = arrdata[child];
// 選取孩子結點的左孩子結點,繼續向下篩選
parent = child;
child = 2 * child;
}arrdata[parent] = temp;
}
內部排序之堆排序
堆排序 heap sort 只需要乙個記錄大小的輔助空間,每個待排序的記錄僅占有乙個儲存空間。1 基本概念 a 堆 設有n個元素的序列 對所有的i 1,2,int n 2 當滿足下面關係 ki k2i,ki k2i 1 或 ki k2i,ki k2i 1 這樣的序列稱為堆。堆的兩種型別 根結點最小的...
內部排序 堆排序初探
堆排序 heapsort 是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即a parent i a i 在陣列的非降序排序中,需要使用的就是大根...
堆排序 堆排序優化 索引堆排序
堆排序 堆排序優化 索引堆排序 注 堆排序 索引堆排序 都是不穩定的排序。注 索引最大堆排序有誤!有沒有大神可以指點一二?1 堆 所有元素 都從索引0開始 父親結點索引 i 左孩子結點索引 2i 1 右孩子結點索引 2i 2 左後乙個非葉子結點索引 n 1 2 用於構建堆,從最後乙個非葉子結點索引開...