// heapSort 是跟着视频学习写的
// headSort2 是我自己想的,感觉这么写可以。。。验证是ok的。
// 区别等我问问。。。
import com.alibaba.fastjson.JSON;
/**
* @author : wangtb
* @date : 2019-09-29 23:02
*/
public class HeapSort {
public static void main(String[] args) {
int arr[] = {6, 2, 0, 1, 8, 20,10,100,-1};
heapSort(arr);
//System.out.println(JSON.toJSONString(arr));
heapSort2(arr);
}
/**
* 貌似也行啊 是因为时间复杂度不好吗?
* @param arr
*/
private static void heapSort2(int[] arr) {
//先转成一个大根堆
int size = arr.length - 1;
while (size > 0) {
for (int i = 0; i <= size; i++) {
headInsert(arr, i);
}
//System.out.println(JSON.toJSONString(arr));
swap(arr, 0, size);
size--;
}
//System.out.println(JSON.toJSONString(arr));
}
public static void heapSort(int arr[]) {
if (arr == null || arr.length < 2) {
return;
}
//先转成一个大根堆
for (int i = 0; i < arr.length; i++) {
headInsert(arr, i);
}
System.out.println(JSON.toJSONString(arr));
//
int heapSize = arr.length;
swap(arr, 0, --heapSize);
System.out.println(JSON.toJSONString(arr));
while (heapSize > 0) {
heapify(arr, 0, heapSize);
//headInsert(arr,heapSize);
swap(arr, 0, --heapSize);
}
}
//初次形成大根堆
public static void headInsert(int arr[], int index) {
while (arr[index] > arr[(index - 1) / 2]) {
swap(arr, index, (index - 1) / 2);
index = (index - 1) / 2;
}
}
public static void heapify(int arr[], int index, int heapSize) {
int left = index * 2 + 1;
while (left < heapSize) {
//比左右哪2个大
int largest = left + 1 < heapSize && arr[left + 1] > arr[left] ? left + 1 : left;
largest = arr[largest] > arr[index] ? largest : index;
if (largest == index) {
break;
}
swap(arr, largest, index);
// System.out.println("heapify start, heapsize = " + heapSize);
// System.out.println(JSON.toJSONString(arr));
// System.out.println("heapify end");
index = largest;
left = index * 2 + 1;
}
}
public static void swap(int arr[], int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}