前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >堆排序

堆排序

作者头像
背雷管的小青年
发布2020-06-08 14:46:15
2860
发布2020-06-08 14:46:15
举报
public static void heapSort(int[] a){

int N = a.length;

for(int k = N/2 - 1; k >= 0; k--){ //for循环用来构造堆,最终生成最大堆

​       sink(a,k,N - 1);

}

for(int i = N - 1;i >= 1;i--){ //从数组最后一个元素开始向前循环

​     exch(a,0,i); //堆顶a[0]与堆的最后一个元素a[i]交换位置,下一轮循环i--会去掉最后一个元素到有序区,减小新堆

​     sink(a,0,i); //i已经--了,剩下的元素重新生成为最大堆

}

}

/**

从上至下堆有序化

*/

private static void sink(int[] a,int k,int length){

while(2*(k+1) <= length) { //length为这次排序的堆的最后一个元素索引

​     int j = 2*k;

​     if(j < length && a[j] < a[j+1]){ //j<N保证j+1不越界,a[j]和a[j+1]是a[K]的左右子节点,这里是为了选取两个子节点较大的一个,a[j]大取a[j],a[j]小取a[j++]

​       j++;

​     }

​     if(a[k] >= a[j]) { //如果父节点大于等于值大的子节点,堆有序,终止循环

​       break;

​     }

​     exch(a,k,j); //交换值大的子节点和父节点的值,达到堆有序

​     k = j; //子节点,作为下一个循环的父节点,继续下沉

}

}

/**

交换两个元素

*/

private static void exch(int[] a,int i,int j){

int temp = a[i];

a[i] = a[j];

a[j] = temp;

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档