堆排序
- 先让整个数组都变成大根堆结构,建立堆的过程:
- 从上到下的方法,时间复杂度为O(N*logN)
- 从下到上的方法,时间复杂度为O(N)
- 把堆的最大值和堆末尾的值交换,然后减少堆的大小之后,再去调整堆,一直周而复始,时间复杂度为O(N*logN)
- 堆的大小减小成0之后,排序完成
public static void heapSort(int[] arr) {
if(arr ==null || arr.length<1){
return
}
int length = arr.length
//将数组转为堆结构
for (int i = arr.length - 1
heapify1(arr, i, length)
}
//将顶部和末端的切换并减小size
while (length > 0) {
swap(arr, 0, --length)
heapify1(arr, 0, length)
}
}
private static void heapify1(int[] arr, int i, int length) {
int left = i * 2 + 1
while (left < length) {
int largest = (left + 1) < length && arr[left] < arr[left + 1] ? (left + 1) : left
int largest_arr = arr[largest]
if (largest_arr > arr[i]) {
arr[largest] = arr[i]
arr[i] = largest_arr
i = largest
left = i * 2 + 1
} else {
break
}
}
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i]
arr[i] = arr[j]
arr[j] = tmp
}