码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序

时间:2020-03-31 12:47:06      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:sort   关于   计算   构建   问题   boolean   length   bool   ret   

 

 

问题描述:

通过堆排序,从小到大排序一个数组。

 

算法实现:

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

 

堆排序

标签:sort   关于   计算   构建   问题   boolean   length   bool   ret   

原文地址:https://www.cnblogs.com/heibingtai/p/12604075.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!