public class Main {
public static void main(String[] args) {
int[] arr = {16,7,3,20,17,8};
heapSort(arr);
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + " "); // 如果有需要,可以去掉最后元素后面的空格,这里没有进行处理
}
}
/**
*
* @param arr 待调整的堆
* @param index 调整这个堆的具体那个节点的值
* @param len 整个堆的大小(这个参数在构建堆的时候没有什么用,但是在后面对最大堆进行排序的时候是必不可少的)
*/
public static void heapAdjust(int[] arr, int index, int len){
if(arr == null || len <= 1){
return;
}
if(index >= len / 2){ // 如果是叶子节点,不需要调整
return;
}
int maxIndex = index;
int left = index * 2 + 1;
int right = index * 2 + 2;
if(left < len && arr[left] > arr[maxIndex]){
maxIndex = left;
}
if (right < len && arr[right] > arr[maxIndex]) {
maxIndex = right;
}
if (maxIndex != index) {
int tmp = arr[maxIndex];
arr[maxIndex] = arr[index];
arr[index] = tmp;
heapAdjust(arr, maxIndex, len);
}
}
// 通过给定的一个数组建立最大堆
public static void buildHeap(int[] arr){
for(int i = arr.length / 2 - 1; i >= 0 ; i--){
heapAdjust(arr, i, arr.length);
}
}
// 对给定的一个初始数组进行堆排序
public static void heapSort(int[] arr){
buildHeap(arr);
for(int i = arr.length - 1; i > 0; i--){
int tmp = arr[0];
arr[0] = arr[i];
arr[i] = tmp;
heapAdjust(arr, 0, i);
}
}
}
堆排序的Java实现
最新推荐文章于 2024-07-13 13:55:40 发布