堆排序

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,直到所有元素有序。

 

以上是关于堆排序的主要内容,如果未能解决你的问题,请参考以下文章

选择排序(简单选择排序堆排序的算法思想及代码实现)

排序--08---堆排序

python代码实现堆排序

算法-java代码实现堆排序

一文带你了解堆排序

堆排序