1.堆排序基本介紹
堆排序是利用堆這種數據結構而設計的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均爲O(nlogn),它也是不穩定排序。
堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱爲大頂堆, 注意 : 沒有要求結點的左孩子的值和右孩子的值的大小關係。
每個結點的值都小於或等於其左右孩子結點的值,稱爲小頂堆
大頂堆舉例說明
- 小頂堆舉例說明
2.排序的基本思想
- 將待排序序列構造成一個大頂堆
- 此時,整個序列的最大值就是堆頂的根節點。
- 將其與末尾元素進行交換,此時末尾就爲最大值。
- 然後將剩餘n-1個元素重新構造成一個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到一個有序序列了。
3.代碼
package cn.smallmartial.tree;
import java.util.Arrays;
/**
* @Author smallmartial
* @Date 2019/6/17
* @Email [email protected]
*/
public class HeapSort {
public static void main(String[] args) {
//數組升序排列
int arr[] = {4,6,8,5,9};
int temp =0;
// adjustHeap(arr,1,arr.length);
// System.out.println("第一次"+ Arrays.toString(arr));//4.9.8.5,6.
//
// adjustHeap(arr,0,arr.length);
// System.out.println("第二次"+Arrays.toString(arr));
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);
}
System.out.println(Arrays.toString(arr));
}
//編寫一個堆排序的方法
public static void heapSort(int arr[]){
System.out.println("堆排序");
}
//將一個數組調整成一個大頂堆
public static void adjustHeap(int arr[],int i, int length){
int temp = arr[i];
for (int k = i*2 + 1; k < length; k=k*2+1) {
if (k+1 <length && arr[k] <arr[k+1]){
k++;
}
if (arr[k] >temp){
arr[i] = arr[k];
i = k;
}else {
break;
}
}
arr[i] = temp;
}
}