堆排序的基本思路:
1.将无序序列构建成一个堆,根据升降序选择大小顶堆;
2.将堆顶元素与末尾元素交换;
3.将剩余元素再构建成堆,重复1、2步骤,直至整个序列有序。
代码如下:
package DataStructures.tree;
import java.util.Arrays;
/*
堆排序
*/
public class HeapSort {
public static void main(String[] args) {
int[] arr = {4,6,8,5,9};
heapSort(arr);
}
//堆排序
public static void heapSort(int[] arr){
int temp = 0;
System.out.println("堆排序");
// adjustHeap(arr,1, arr.length);
// System.out.println("第一次:"+ Arrays.toString(arr));
// 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));
}
/**
* 调整堆:升序大顶堆,降序小顶堆
* 将对应的非叶子节点的树调整成大顶堆
* @param arr 待调整的数组
* @param i 表示非叶子节点在数组中的索引
* @param length 表示有多少个元素继续调整
*/
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++; //k指向右子节点
}
if (arr[k] > temp){
arr[i] = arr[k];
i = k;
} else {
break;
}
}
arr[i] = temp;
}
}