package com.company.排序;
import java.util.Arrays;
public class 堆排序test {
public static void main(String[] args) {
int a[]=new int[]{1,3,6,9,14,0,89,4,5};
heapSort(a);
System.out.println(Arrays.toString(a));
}
public static void heapSort(int[] arr) {
if(arr==null||arr.length<2){
return;
}
//构建大顶堆 不停的往堆中放
for(int i=0;i<arr.length;i++){
heapInsert(arr,i);
}
// 交换堆顶和当前末尾的节点,重置大顶堆 不停的把堆中最大的值放到最后 实现排序
int heapSize = arr.length;
while(heapSize>0){
swap(arr, 0, --heapSize);
heapify(arr,0,heapSize);
}
}
private static void heapInsert(int[] arr, int index){ //向堆内增加值
while(arr[index] > arr[(index - 1) / 2]) {
swap(arr, index, (index-1) /2);
index = (index -1)/2;
}
}
private static void heapify(int[] arr, int index, int size){ //大顶堆化
int left = 2*index+1;
while(left < size){
int largest = left+1<size && arr[left+1] > arr[left] ? left+1 : left;
largest = arr[largest] > arr[index] ? largest: index;
if(largest==index){
return;
}
swap(arr,index, largest);
index=largest;
left = largest * 2 +1;
}
}
private static void swap(int arr[], int x, int y){ //交换两个数
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
堆排序学习
最新推荐文章于 2024-10-04 18:47:42 发布