排序二 堆排序

2021-07-27 07:25:57 字數 1762 閱讀 1137

子結點的鍵值或索引總是小於(或者大於)它的父節點。

堆通過一維陣列實現。在起始陣列為 0 的情形中:

父節點i的左子節點在位置 (2*i+1);

父節點i的右子節點在位置 (2*i+2);

子節點i的父節點在位置 floor((i-1)/2);

堆中的最大值總是位於根節點。堆中定義以下幾種操作:

1、最大堆調整(max_heapify):將堆的末端子節點作調整,使得子節點永遠小於父節點

2、建立最大堆(build_max_heap):將堆所有資料重新排序

堆排序(heapsort):移除位在第乙個資料的根節 點,並做最大堆調整的遞迴運算

3、得到 堆底(0)有最大值。對換 堆底 和 堆頂值。

然後迴圈遞迴 上述操作,找最大值話到堆底,再把 堆底值到到未排序的元素的 「堆頂」。

* 建立最大堆

* @param data

* @param heapsize 需要建立最大堆的大小,一般在sort的時候用到,因為最多值放在末尾,末尾就不再歸入最大堆了

* @param index 當前需要建立最大堆的位置

*/private static void maxheapify(int data, int heapsize, int index)

if (right < heapsize && data[largest] < data[right])

//得到最大值後可能需要交換,如果交換了,其子節點可能就不是最大堆了,需要重新調整

if (largest != index)

}/**

* 排序,最大值放在末尾,data雖然是最大堆,在排序後就成了遞增的

* @param data

*/private static void heapsort(int data)

}/**

* 父節點位置

* @param current

* @return

*/private static int getparentindex(int current)

/*** 左子節點position 注意括號,加法優先順序更高

* @param current

* @return

*/private static int getchildleftindex(int current)

/*** 右子節點position

* @param current

* @return

*/private static int getchildrightindex(int current)

private static void print(int data)

system.out.print(data[i] + " |");}}

/*** 以2為底的對數

* @param param

* @return

*/private static double getlog(double param)

}

排序演算法(二) 堆排序

堆排序 堆是指每個節點值大於 小於其左右節點值的完全二叉樹,根節點一定是堆的所有節點中最大 小節點所在處 節點值大於左右節點值的堆叫大頂堆,根元素為整個堆的最大值。節點值小於左右節點值的堆 叫小頂堆。堆排序過程 1 將無序陣列構建成堆結構。2 將根節點值與最後乙個節點值互換,此時最後乙個節點值最大 ...

排序演算法二 堆排序

堆排序的時間複雜度為 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節點進行了交換,為保證陣列的整個堆結構,必須對交換的節點繼...