1、預備知識
-
利用大頂堆進行升序排序
不多說,先看看大頂堆長什麼鳥樣
特徵就是對於每一個局部二叉樹,父節點總是大於左右子節點,左右節點的大小沒有關係。
小頂堆同理。
-
二叉樹和數組的關係:上面的二叉樹可以轉換成相應的數組是[90,80,70,60,50,60,20,10],具體怎麼轉化,苦於自身口技,大家就自己查資料吧
2、開始排序
2.1、基本思想:
對於算法,思想纔是精髓。
1)將待排序的數組構造成大頂堆,整個序列的最大值就是堆頂;
2)將堆頂元素與序列的末尾元素進行交換,此時末尾爲最大值,其不參與後面的排序;
3)將剩餘的n-1個元素狗造成一個大頂堆,這樣就得到了次小值,反覆2,3操作,便可得到一個升序序列;
2.2、調整局部二叉樹
對 下表爲1的根節點進行調整
對應的代碼
/**
* 對局部二叉樹進行調整
* @param arr
* @param i
* @param len
*/
public static void adjustHeap(int[] arr, int i, int len){
int temp = arr[i];
for (int j = 2*i+1; j < len ; j = j*2+1) {
// 右子樹不能越界
if (j+1 < len && arr[j] < arr[j+1]) {
j++;
}
//交換父節點和葉子節點
if (arr[j] > temp){
arr[i] = arr[j];
i = j;
}else {
break;
}
}
arr[i] = temp;
}
2.2、構建大頂堆和進行排序
//1)將待排序的數組構造成大頂堆,整個序列的最大值就是堆頂;
//2)將堆頂元素與序列的末尾元素進行交換,此時末尾爲最大值,其不參與後面的排序;
//3)將剩餘的n-1個元素狗造成一個大頂堆,這樣就得到了次小值,反覆2,3操作,便可得到一個升序序列;
public static void heapSort(int[] arr){
int temp = 0;
//調用上面的方法,調整爲大頂堆
for (int i = arr.length/2-1 ; i >= 0; i--) {
adjustHeap(arr,i,arr.length);
}
for (int j = arr.length-1; j > 0 ; j--) {
temp = arr[j];
arr[j] = arr[0];
arr[0] = temp;
adjustHeap(arr,0,j);
}
}
測試結果
int[] arr = {4,6,8,5,9,35,56,3,2};
System.out.println("原始數組:"+Arrays.toString(arr));
heapSort(arr);
System.out.println("排序後數組:"+Arrays.toString(arr));