首页 > 编程语言 >排序算法小结

排序算法小结

时间:2023-02-06 17:34:26浏览次数:45  
标签:nlogn 冒泡排序 算法 序列 n2 排序 小结


[b]1 快速排序(QuickSort)[/b]

快速排序是一个就地排序,分而治之,大规模递归的算法。从本质上来说,它是归并排序的就地版本。快速排序可以由下面四步组成。

(1) 如果不多于1个数据,直接返回。
(2) 一般选择序列最左边的值作为支点数据。
(3) 将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。
(4) 对两边利用递归排序数列。

快速排序比大部分排序算法都要快。尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。

[b]2 归并排序(MergeSort)[/b]

归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。

[b]3 堆排序(HeapSort)[/b]

堆排序适合于数据量非常大的场合(百万数据)。

堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。

堆排序会将所有的数据建成一个堆,最大的数据在堆顶,然后将堆顶数据和序列的最后一个数据交换。接下来再次重建堆,交换数据,依次下去,就可以排序所有的数据。

[b]4 Shell排序(ShellSort)[/b]

Shell排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。平均效率是O(nlogn)。其中分组的合理性会对算法产生重要的影响。现在多用D.E.Knuth的分组方法。

Shell排序比冒泡排序快5倍,比插入排序大致快2倍。Shell排序比起QuickSort,MergeSort,HeapSort慢很多。但是它相对比较简单,它适合于数据量在5000以下并且速度并不是特别重要的场合。它对于数据量较小的数列重复排序是非常好的。

[b]5 插入排序(InsertSort)[/b]

插入排序通过把序列中的值插入一个已经排序好的序列中,直到该序列的结束。插入排序是对冒泡排序的改进。它比冒泡排序快2倍。一般不用在数据大于1000的场合下使用插入排序,或者重复排序超过200数据项的序列。

[b]6 冒泡排序(BubbleSort)[/b]

冒泡排序是最慢的排序算法。在实际运用中它是效率最低的算法。它通过一趟又一趟地比较数组中的每一个元素,使较大的数据下沉,较小的数据上升。它是O(n^2)的算法。

[b]7 交换排序(ExchangeSort)和选择排序(SelectSort)[/b]

这两种排序方法都是交换方法的排序算法,效率都是 O(n2)。在实际应用中处于和冒泡排序基本相同的地位。它们只是排序算法发展的初级阶段,在实际中使用较少。

[b]8 基数排序(RadixSort)[/b]

基数排序和通常的排序算法并不走同样的路线。它是一种比较新颖的算法,但是它只能用于整数的排序,如果我们要把同样的办法运用到浮点数上,我们必须了解浮点数的存储格式,并通过特殊的方式将浮点数映射到整数上,然后再映射回去,这是非常麻烦的事情,因此,它的使用同样也不多。而且,最重要的是,这样算法也需要较多的存储空间。

[b]9 总结[/b]

下面是一个总的表格,大致总结了我们常见的所有的排序算法的特点。
[table]
|排序法|平均时间|最差情形|稳定度|额外空间|备注|
|冒泡|O(n2)|O(n2)|稳定|O(1)|n小时较好|
|交换|O(n2)|O(n2)|不稳定|O(1)|n小时较好|
|选择|O(n2)|O(n2)|不稳定|O(1)|n小时较好|
|插入|O(n2)|O(n2)|稳定|O(1)|大部分已排序时较好|
|基数|O(logRB)|O(logRB)|稳定|O(n)|B是真数(0-9),R是基数(个十百)|
|Shell|O(nlogn)|O(ns) 1<2|不稳定|O(1)|s是所选分组|
|快速|O(nlogn)|O(n2)|不稳定|O(nlogn)|n大时较好|
|归并|O(nlogn)|O(nlogn)|稳定|O(1)|n大时较好|
|堆|O(nlogn)|O(nlogn)|不稳定|O(1)|n大时较好|
[/table]

标签:nlogn,冒泡排序,算法,序列,n2,排序,小结
From: https://blog.51cto.com/u_15955464/6039978

相关文章

  • 【算法训练】贪心
    例题一有m元钱,n种物品;每种物品有j磅,总价值f元,可以使用0到f的任意价格购买相应磅的物品,例如使用0.3f元,可以购买0.3j磅物品。要求输出用m元钱最多能买到多少磅物品。题解买......
  • 【算法训练】二分查找
    二分查找二分查找建立在待查找元素有序的前提上例题题目描述输入N个学生的学号,然后查询输入输入的第一行为N,即学生的个数(N<=1000)接下来的N行包括N个学生的信息,信息格式......
  • 【算法训练】Hash的应用
    Hash的应用当数据较为庞大,但是数据的数量是有限范围内的,各不相同的。例题题目描述给你n个整数,请按从大到小的顺序输出其中前m大的数。输入每组测试数据有两行,第一行有两个......
  • 欧几里得算法及其扩展
    欧几里得算法及其扩展前言整除:对于整数\(a(a\ne0)\)和\(b\),如果\(\existsq\inZ\),使得\(b=a\timesq\),则称\(a\)能整除\(b\),记作\(a\midb\)。否则,称\(a\)......
  • 查找算法之斐波那契查找
    由来:斐波那契数列:前两项之和等于第三项,假如下标为k,那么f[k]=f[k-1]+f[k-2]。如果将一条长为f[k]的线段分为两条线段,它们的长度分别为f[k-1]和f[k-2],这种分法很接近黄......
  • 【八大数据排序法】合并排序法的图形理解和案例实现 | C++
    第十九章合并排序法:::hljs-center目录第十九章合并排序法●前言●认识排序●一、合并排序法是什么?1.简要介绍2.具体情况3.算法分析●二、案例实现1.......
  • 《区块链基础知识25讲》-第十讲-哈希算法
    无论输入数据的大小及类型如何,均可以将输入数据转换成固定长度的输出加密哈希算法拥有的特征能为任意类型的数据快速创建哈希值确定性:相同输入必定产生相同哈希值,换句话说,......
  • 代码随想录算法训练营第十八天|LeetCode 513.找树左下角的值、112. 路径总和 、113.路
    513.找树左下角的值文章:代码随想录(programmercarl.com)视频:怎么找二叉树的左下角?递归中又带回溯了,怎么办?|LeetCode:513.找二叉树左下角的值_哔哩哔哩_bilibili思路(......
  • 机器学习中入门级必学的算法有哪些?
    文章目录​​一、K-近邻算法​​​​二、线性回归​​​​三、逻辑回归​​​​四、决策树算法​​​​五、集成算法​​​​六、聚类算法​​一、K-近邻算法什么是k-近邻算......
  • 《剑指Offer》-53-在排序数组中查找数字/力扣-34
    Ⅰ统计一个数字在排序数组中出现的次数 intsearch(vector<int>&nums,inttarget){ intcount=0; for(intnum:nums){ if(num==target)count++; ......