当前位置: 首页 > news >正文

简单评价各种排序算法的优劣

    http://blog.csdn.net/hi_dzj/article/details/5993146

    一、冒泡排序

        已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。


        优点:稳定;

        缺点:慢,每次只能移动相邻两个数据。

        二、选择排序

        冒泡排序的改进版。

        每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

        选择排序是不稳定的排序方法。

        n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:

        ①初始状态:无序区为R[1..n],有序区为空。

        ②第1趟排序

        在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。


        ……

        ③第i趟排序

        第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录
      R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

        这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。

        优点:移动数据的次数已知(n-1次);

        缺点:比较次数多。

        三、插入排序

        已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、……b[m],需将二者合并成一个升序数列。首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若无数组a,可将b[1]当作n=1的数组a)


        优点:稳定,快;

        缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。

        三、缩小增量排序

        由希尔在1959年提出,又称希尔排序(shell排序)。

        已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。发现当n不大时,插入排序的效果很好。首先取一增量d(d<n),将a[1]、a[1+d]、a[1+2d]……列为第一组,a[2]、a[2+d]、a[2+2d]……列为第二组……,a[d]、a[2d]、a[3d]……列为最后一组以次类推,在各组内用插入排序,然后取d'<d,重复上述操作,直到d=1。


        优点:快,数据移动少;

        缺点:不稳定,d的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。

        四、快速排序

        快速排序是目前已知的最快的排序方法。

        已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先任取数据a[x]作为基准。比较a[x]与其它数据并排序,使a[x]排在数据的第k位,并且使a[1]~a[k-1]中的每一个数据<a[x],a[k+1]~a[n]中的每一个数据>a[x],然后采用分治的策略分别对a[1]~a[k-1]和a[k+1]~a[n]两组数据进行快速排序。


        优点:极快,数据移动少;

        缺点:不稳定。

        五、箱排序

        已知一组无序正整数数据a[1]、a[2]、……a[n],需将其按升序排列。首先定义一个数组x[m],且m>=a[1]、a[2]、……a[n],接着循环n次,每次x[a]++.


        优点:快,效率达到O(1)

        缺点:数据范围必须为正整数并且比较小

        六、归并排序

        归并排序是多次将两个或两个以上的有序表合并成一个新的有序表。最简单的归并是直接将两个有序的子表合并成一个有序的表。

        归并排序是稳定的排序.即相等的元素的顺序不会改变.如输入记录 1(1) 3(2) 2(3) 2(4) 5(5) (括号中是记录的关键字)时输出的
      1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2
      是按输入的顺序.这对要排序数据包含多个信息而要按其中的某一个信息排序,要求其它信息尽量按输入的顺序排列时很重要.这也是它比快速排序优势的地方.

转载于:https://www.cnblogs.com/auleaf/archive/2011/09/27/2193674.html

相关文章:

  • 50、linux shell命令,netstat,traceroute
  • 在兄弟连的感受
  • BB进度
  • jQuery右键菜单插件ContextMenu
  • AssionShop开源B2C电子商务系统-定单流程活动图状态图(转)
  • 扩展方法的定义及使用
  • 用Restful方式调用WCF进行上传下载(转)
  • 飞雪桌面日历注册码
  • 趋势科技:Web2.0网站将成黑客首要攻击目标
  • 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用42
  • CENTOS NTFS支持
  • SSD固态硬盘解析和部署注意事项
  • Visual Studio 2010 中的代码约定设置
  • DevExpress ASPxGridView 使用方法概述
  • SQL2005 数据的导出 bcp 命令
  • 收藏网友的 源程序下载网
  • @angular/forms 源码解析之双向绑定
  • codis proxy处理流程
  • django开发-定时任务的使用
  • JS专题之继承
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • node.js
  • PaddlePaddle-GitHub的正确打开姿势
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • vagrant 添加本地 box 安装 laravel homestead
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 简单易用的leetcode开发测试工具(npm)
  • 微信小程序实战练习(仿五洲到家微信版)
  • 消息队列系列二(IOT中消息队列的应用)
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)STL算法之遍历容器
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (C语言)fgets与fputs函数详解
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (Ruby)Ubuntu12.04安装Rails环境
  • (第二周)效能测试
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • .net web项目 调用webService
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .Net的DataSet直接与SQL2005交互
  • .net反混淆脱壳工具de4dot的使用
  • :O)修改linux硬件时间
  • @GlobalLock注解作用与原理解析
  • []FET-430SIM508 研究日志 11.3.31
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [AIGC] 开源流程引擎哪个好,如何选型?
  • [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项