堆排序 是一个时间复杂度为O(nlogn)的排序算法,基于它的效率比较好。同时利用了完全二叉树的概念。
算法描述如下
/**
* 堆排序 基于完全二叉树
* @param arr
*/
public static void heapSort(int arr[]){
for(int i = arr.length/2;i>=0;i--){
arrHeap(arr,i,arr.length);
}
for (int i = arr.length-1; i >0 ; i--) {
swap(arr,i,0);
arrHeap(arr,0,i);
}
}
/**
* 调整大顶堆
* @param arr
* @param m 当前节点
* @param n 长度
*/
public static void arrHeap(int arr[],int i,int length){
int temp = arr[i];//先取出当前元素i
for(int k=i*2+1;k<length;k=k*2+1){//从i结点的左子结点开始,也就是2i+1处开始
if(k+1<length && arr[k]<arr[k+1]){//如果左子结点小于右子结点,k指向右子结点
k++;
}
if(arr[k] >temp){//如果子节点大于父节点,将子节点值赋给父节点(不用进行交换)
arr[i] = arr[k];
i = k;
}else{
break;
}
}
arr[i] = temp;//将temp值放到最终的位置
}
public static void swap(int arr[],int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}