设为首页 收藏本站
查看: 1011|回复: 0

[经验分享] 选择排序

[复制链接]

尚未签到

发表于 2017-12-9 18:33:30 | 显示全部楼层 |阅读模式
  堆排序
  大根堆定义:根节点大于左右子节点
  基本原理:堆排序是一树形选择排序。特点是:在排序过程中,将数组看成是一棵完全二叉树的顺序存储结构(如下图所示),利用完全二叉树中根结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大(或最小)的记录
   DSC0000.png
  根据完全二叉树的性质有
  如果按照下标从0开始,如果该节点有左孩子节点或者右孩子节点
  那么就有左孩子节点下标 = 2*i+1右孩子节点 = 2*i+2
  时间复杂度:O(N*logN)
  稳定性:不稳定
  注意事项:由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的排序
  排序流程
  我们先构建一个大堆,第一次构建的时候 我们需要从底往上构建(简单一点)
  后面每次只是需要对堆进行调整即可(从上往下 )



public class HeapSelectSort {
public static void main(String[] args) {
int[] array = { 19, 8, 27, 6, 315, 14, 99 };
firstBuildMaxHeap(array);
for(int i=array.length-1;i>=0;i--)
{
exchange(array,0,i);
adjustMaxHeap(array, i, 0);
}
for (int i : array) {
System.out.print(" "+i);
}
}
//第一次构建大根堆 从下往上构建 会更简单一点
private static void firstBuildMaxHeap(int[] array) {
int half = (array.length-1)>>1;
for(int i=half-1;i>=0;i--)
{
adjustMaxHeap(array,array.length,i);
}
}
//调整堆
private static void adjustMaxHeap(int[] a, int length, int i) {
int left = 2*i+1; //左节点下标
int right = 2*i+2;//右节点下标
int large = i;
if(left<length && a[left]>a)
{
large = left;
}
if(right<length && a[right] > a[large] )
{
large = right;
}
//如果large不是当前的下标
if(large!=i)
{
exchange(a,large,i);
adjustMaxHeap(a,length,large);
}

}
private static void exchange(int[] a, int bigger, int i) {
int temp = a[bigger];
a[bigger] = a;
a = temp;
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-422482-1-1.html 上篇帖子: 初识RabbitMQ,附RabbitMQ+PHP演示实例 下篇帖子: python第五十九天-----补上笔记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表