標籤:font swa 長度 父節點 int style 數組 swap --
//本文適用於對堆排序部分理解的同學,主要體現的是代碼的簡潔.
/*演算法思想(以大頂堆為例):
1.將長度為n的待排序的數組進行堆有序化構造成一個大頂堆
2.將根節點與尾節點交換並輸出此時的尾節點
3.將剩餘的n -1個節點重新進行堆有序化
4.重複步驟2,步驟3直至構造成一個有序序列*/
//堆排序
public class HeapSort {
public static void heapSort(int arr[]){
int size = arr.length;
//初始化大根堆
for (int i=0;i<arr.length;i++){
heapInsert(arr,i);
}
swap(arr,0,--size); //第一個元素和最後一個元素交換。
while (size>0){ //剩下所有的,依次進行排序,每次確定一個位置。
heapify(arr,0,size);
swap(arr,0,--size);
}
}
//從後向前,確定資料元素的位置。
public static void heapify(int arr[],int index,int size){
int left = index*2+1; //設左孩子為left
while (left<size){
int largest = left+1<size&&arr[left]<arr[left+1]?left+1:left; //左孩子和右孩子判斷,取大的
largest = arr[index]>arr[largest]?index:largest; //左右之中大的和父節點比較
if (largest==index){ //如果父節點大,就說明原位置不變,此時返回即可。
return;
}
swap(arr,largest,index);
index = largest;
left = index*2+1; //層層判斷
}
}
// 每插入一個元素,從建立立大根堆,用於初始化用。
public static void heapInsert(int arr[],int index){
while (arr[index]>arr[(index-1)/2]){
swap(arr,index,(index-1)/2);
index = (index-1)/2;
}
}
// 設定一個交換。
public static void swap(int arr[],int p,int q){
int temp = arr[p];
arr[p] = arr[q];
arr[q] = temp;
}
}
總結:理解了就很簡單。
堆排序講解(代碼簡潔)