//調整待調整位置結點
public static void heapAdjust(int a[], int i, int length){
int demo = a[i]; //待調整位置結點
int child = 2*i+1; //左孩子結點的位置。
while (child<length){
if(child+1<length && a[child+1]>a[child]){ //如果右孩子比左孩子大
child++; //右孩子結點位置
}
if(a[i]<a[child]){ //如果待調整位置結點小於孩子結點中最大的
a[i] = a[child]; //將孩子結點上移代替父結點
i = child; //新的待調整結點位置
child = 2*i+1; //新的左孩子結點位置
}else {
break; //反之不需要調整
}
a[i] = demo; //將待調整結點的值給新的待調整結點
}
}
//堆排序
public static void heapSort(int a[], int length) {
//此循環爲了初始化堆
for (int i = (length - 1) / 2; i >= 0; i--) {
heapAdjust(a, i, length);
}
for (int i = length - 1; i >= 0; i--) {
//交換堆頂元素H[0]和堆中最後一個元素
int temp = a[i];
a[i] = a[0];
a[0] = temp;
//每次交換堆頂元素和堆中最後一個元素之後,都要對堆進行調整
heapAdjust(a, 0, i);
}
}
//主函數
public static void main(String[] args) {
int a[] = {3,2,5,8,4,7,6,9};
heapSort(a,8);
//輸出
for(int x=0; x<8; x++){
System.out.print(a[x]+" ");
}
System.out.println();
}
八大排序之選擇排序—堆排序(Heap Sort)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.