//本文适用于对堆排序部分理解的同学,主要体现的是代码的简洁.
/*算法思想(以大顶堆为例):
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;
}
}
总结:理解了就很简单。
原文地址:https://www.cnblogs.com/liuwentao/p/9350089.html