堆排序
Posted heibingtai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序相关的知识,希望对你有一定的参考价值。
问题描述:
通过堆排序,从小到大排序一个数组。
算法实现:
public static void heapSort(int[] arr) {
int N = arr.length - 1;
for(int i = arr.length / 2 - 1; i >= 0; i--) {
sink(arr, i, N);
}
while (N > 0) {
exch(arr, 0, N--);
sink(arr, 0, N);
}
}
//构建索引k对应的大顶堆
public static void sink(int[] arr, int k, int N) {
while (2 * k + 1<= N) {
int j = 2 * k + 1;
if(j < N && less(arr, j, j+ 1)) j++;
if(!less(arr, k, j)) break; //如果索引k对应的数不小于索引j对应的数,则跳出循环
exch(arr, k, j); //否则交换
k = j;
}
}
public static boolean less(int[] arr, int j, int k) {
if(arr[j] < arr[k]) {
return true;
}
return false;
}
public static void exch(int[] arr, int m, int n) {
int temp = arr[m];
arr[m] = arr[n];
arr[n] = temp;
}
算法解析:
1.依据数组性质,构建一个大顶堆,在这里需要用到循环,从下到上遍历(关于起始索引,画一个二叉堆计算一下即可得出)
2.将大顶堆的第0个元素和最后一个“未排序”的元素交换;
3.去掉数组已排序的部分,重新构建一个大顶堆(在之前构建堆大顶堆的基础上,从上到下遍历即可);
4.重复2-3,直到所有元素有序。
以上是关于堆排序的主要内容,如果未能解决你的问题,请参考以下文章