`
tibaloga
  • 浏览: 872527 次
文章分类
社区版块
存档分类
最新评论

各种排序算法的优劣

 
阅读更多

各种排序优缺点
文章分类:综合技术
转载程序人生 2010-04-24 23:25:20

一、冒泡排序

  已知一组无序数据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
是按输入的顺序.这对要排序数据包含多个信息而要按其中的某一个信息排序,要求其它信息尽量按输入的顺序排列时很重要.这也是它比快速排序优势的地方.

分享到:
评论

相关推荐

    各种排序算法的优缺点

    冒泡排序 选择排序 插入排序 缩小增量排序 快速排序 箱排序

    排序算法的优劣比较

    排序算法的优劣比较,经过比较不同的数据量,进行不同的排序后的时间比较。

    C语言各种排序算法比较

    实现了各种排序算法,包括选择排序,交换排序,堆排序,折半排序等。比较了各种排序算法在性能上的优缺点

    数据结构排序算法的实现

    本问题要实现直接插入、冒泡、快速、简单选择、归并、堆排序六种排序算法的简单运用及比较,分析他们的稳定性及在不同规模下的复杂度,了解在什么情况下使用什么排序算法比较合适;待排序的元素好吗关键字为整数,...

    排序算法比较 C实现

    此设计题目要求了解掌握各种排序算法、分析其优劣。故设计总体框架如下:定义一个主函数,在主函数中定义一个长度MAXSIZE=31000的数组,存放随机数。 在主函数中,定义该线性表的初始长度为零,并调用为该一维顺序...

    内部排序算法的比较

    每种算法都有自己的比较方法和优缺点,本程序能更直观的显示出各种排序的比较次数、移动次数和排序时间,并能用条形图(星号表示)进行表示,以便比较各种排序的优劣。该程序运用了数据结构中线性表的顺序存储结构和...

    几种排序算法总结及比较

    在vs2013中打开

    内部排序算法的比较已知技术参数和设计

    通过随机数据比较各内部排序算法的关键字比较次数和关键字移动的次数,以取得直观感受。待排序表的表长不小于100;...每次测试完毕显示各种比较指标的列表,以便比较各种排序的优劣。 最后要对结果作简单的分析。

    多种排序算法代码(快速排序)

    1.直接插入排序--增量法 2.希尔排序 3.交换排序 4.快速排序 5.直接选择排序 6.堆排序 7.归并排序

    数据结构-排序算法性能分析

    设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。 【基本要求】 (1)实现各种内部排序。包括冒泡排序,直接选择排序,希尔排序,快速排序,堆排序。 (2) 待排序的元素的关键字为整数...

    数据结构排序算法的性能比较

    各种数据结构排序算法的性能比较,很好用的

    山大面向对象实验 排序算法

    设计一个负责排序的程序包,实现多种排序算法,至少包括插入排序、冒泡排序和快速排序算法。 要求: 1.可以对任何简单类型和任意对象进行排序 2.可以支持升序、降序、字典排序等多种顺序要求 3.可以随意增加排序算法...

    重庆理工大学数据结构实验报告+源码+实验数据 内部排序算法的性能分析详尽分析了不同排序算法的优劣,并有20张可视化图对比。

    ⑶ 评价排序的指标有:在表长相同的情况下,各种排序算法的关键字比较次数、关键字移动次数(关键字交换记为3次移动)、排序时间、排序算法的稳定性;当改变表长时,各种排序算法的性能变化情况, ⑷ 结果记录及分析...

    数据结构--课程设计 内部排序算法比较,几大常用算法

    设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。 【基本要求】 (1)实现各种内部排序。包括冒泡排序,直接选择排序,希尔排序,快速排序,堆排序。 (2) 待排序的元素的关键字为整数...

    几种c语言排序优缺点

    几种c语言排序的方法和优缺点,对C语言算法有兴趣的欢迎下载。

    c语言排序算法的比较

    本程序对6种较为常见的排序算法进行实测比较。他们分别是:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序;2. 待排序表元素的关键字为整型。使用正序、逆序和不同程度的打乱获得不同的数据做...

    十大经典排序算法,附带动画演示效果,超硬核

    通过本教程的学习,学生将能够深入理解各种经典排序算法的优缺点,并能够在具体场景中选择合适的排序算法。此外,本教程还提供了丰富的练习题和项目实战,帮助学生巩固所学知识并提高实际应用能力。 总之,《十大...

    一个负责排序的程序包,实现多种排序算法

    设计一个负责排序的程序包,实现多种排序算法,至少包括插入排序、冒泡排序和快速排序算法。 要求: 1.可以对任何简单类型和任意对象进行排序 2.可以支持升序、降序、字典排序等多种顺序要求 3.可以随意增加排序算法...

    各种典型排序算法的源代码

    各种典型排序算法的代码,运用各种典型排序算法对同一组随机数分别进行排序,并从交换次数和比较次数两个方面比较了排序算法的优劣。VC6.0运行成功。

    插入,选择排序的链表实现及快速,希尔,冒泡排序算法实现合集

    插入,选择排序的链表实现及快速,希尔,冒泡排序算法实现

Global site tag (gtag.js) - Google Analytics