技术控

    今日:60| 主题:49101
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] 深入浅出选择类排序算法(简单选择排序,堆排序)

[复制链接]
圈子不同别硬融 发表于 2016-10-3 14:07:13
137 11

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
一.简单选择排序:

  简单选择排序的基本思想是:一次选定数组中的一个数,记下当前位置并假设它是从当前位置开始后面数中的最小数min=i,从这个数的下一个数开始扫描直到最后一个数,并记录下最小数的位置min,扫描结束后如果min不等于i,说明假设错误,则交换min与i位置上的数。(也即每次从数列中找出一个最小的数放到最前面来,再从剩下的n-1个数中选择一个最小的,不断做下去。
   通俗的说:你要在你的班上选择女朋友(假定你有这个特权的话),你开始肯定会最喜欢的,然后再选择次喜欢的,然后继续在剩下的MM中找
  你比较喜欢的。这样就可以按你的要求排成一个序了,就这样理解。
  简单选择排序算法的关键:

  1.每一趟在n-i+1中选取最小的记录
  2.通过n-i次关键字进行比较
  3.总共需要n(n-1)/2次比较
  4.选择排序算法的时间复杂度是“死”的,也就是O(n^2)
  算法代码:

  [code]void SelectSort(int* a, int len) {
    int i,j,k;
    for (i=1; i         j=i;
        for (k=i-1; j             if (a[j] < a[k])   {    /**< 如果排在前面的数字大于后面的就交换两者的key */
                k=j;
            }
        }
        if (k>=i)  {    /**< /一轮结束后,把k认为的最小值和i进行交换  */
            int m;
            m = a[k];
            a[k] = a[i-1];
            a[i-1] = m;
        }
    }
}[/code]  从上面的代码可以看出,整个序列分为有序和无序部分, 在A循环中选取最小关键字,也即是有序序列进行更新的时刻.
   在这个算法中有两层循环, 外层循环执行n次, 内层循环执行n-1次 平均时间复杂度为O( 深入浅出选择类排序算法(简单选择排序,堆排序)-1 (女朋友,关键字,记录,特权) n^2).代码中使用了一个临时变量m,空间复杂度为
  O(1).
  二. 堆排序:

  堆其实可以看成一个完全二叉树, 我们先温习下完全二叉树的定义:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树.

深入浅出选择类排序算法(简单选择排序,堆排序)-2 (女朋友,关键字,记录,特权)

  那么堆又是怎么回事呢, 堆分大小堆.
   大顶堆的需要在满二叉树的定义下再满足, 任何一个非叶结点的值, 都不大于其左右结点的值, 也就是父亲大孩子小.
   小顶堆的需要在满二叉树的定义下再满足, 任何一个非叶结点的值, 都不小于其左右结点的值, 也就是父亲小孩子大.
  根据上面的性质可以得出, 根节点要么最大, 要么最小. 从排序角度来看, 如果一个无序序列调整一个堆的数据结构,那么它必定是有序的. 这个调整的过程就是堆排序的过程.
  我们来取一组数据演示下堆排序的过程:
   原始序列:
12345下一页
友荐云推荐




上一篇:微信小程序版简易计算器
下一篇:[原]awk处理nginx日志
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

阿萨德法国货 发表于 2016-10-11 01:41:04
天灵灵地灵灵,这次一定是沙发!
回复 支持 反对

使用道具 举报

wmin0409 发表于 2016-10-11 02:06:57
如果你真的爱他,那么你必须容忍他部份的缺点。
回复 支持 反对

使用道具 举报

zyxin 发表于 2016-10-11 02:40:57
运气就是机会碰巧撞到了你的努力。
回复 支持 反对

使用道具 举报

李敏 发表于 2016-10-16 14:16:25
在街上看美女,高一点就是欣赏;低一点就是流氓。
回复 支持 反对

使用道具 举报

5zekvo3eny 发表于 2016-10-18 18:44:10
在乎的人不明白,明白的人不在乎。
回复 支持 反对

使用道具 举报

邻家大叔 发表于 2016-10-23 19:02:02
成全别人,恶心自己!
回复 支持 反对

使用道具 举报

kevinshi2010 发表于 2016-10-27 16:29:19
kevinshi2010今天只做了两件事,看帖和回帖
回复 支持 反对

使用道具 举报

董海伟 发表于 2016-10-28 14:52:38
很有看点!
回复 支持 反对

使用道具 举报

jflyr 发表于 2016-10-31 10:28:59
我可以轻视你,鄙视你,小看你,不看你.
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表