实现堆排序
package codingTest5;
public class heapSort {
public static void heapSort(int[] arr) {
if(arr == null || arr.length < 2) {
return;
}
int size = arr.length;
//变成大根堆
for(int i = 0; i < size; i++) {
swim(arr, i);
}
swap(arr, 0, --size);
//堆排序
while(size > 0) {
heapfify(arr, 0, size);
swap(arr, 0, --size);
}
}
public static void swim(int[] arr, int index) {
while(arr[index] > arr[(index - 1)/2]) {
swap(arr, index, (index-1)/2);
index = (index-1)/2;
}
}
public static void heapfify(int[] arr, int index, int size) {
int left = index * 2 + 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(index == largest) {
return;
}
//能走到这步,说明肯定index不等于largest
swap(arr, index, largest);
index = largest;
left = index * 2 + 1;
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int[] arr = {5, 7, 3, 1, 2, 8, 9, 10, 11, 22, 0};
heapSort(arr);
for(int num : arr) {
System.out.print(num + " ");
}
}
}