ura*_*ray 4 c++ sorting algorithm performance bubble-sort
可能重复:
什么是气泡排序适合?
我确信每种算法都有其优点和缺点,那么与其他排序算法相比,buble sort怎么样呢?(当然我希望答案不是"易于学习")
KLe*_*ee1 10
性能方面,冒泡排序不是很好(O(n ^ 2)).以下是它的一些优点:
冒泡排序很容易正确编写(如果你正在做一些快速和脏的事情,那么使用冒泡排序可能更容易).
内存消耗非常低(因为它是就地排序,不像Merge Sort for arrays)
编程更容易.即使是经验丰富的程序员也会快速排序,堆排序和合并排序错误.此外,它不会在堆栈空间中消耗额外的log(n)到O(n).虽然您可以递归地实现堆排序.
基本上算法是这样的
O(n ^ 2)最差情况下的表现
基本上这比较慢......
O(n*lg(n))
通常,当您对输入一无所知时,一般排序的最快排序算法(实际上已经证明这是排序的下限,而不知道输入的任何内容):
O(n)排序
如果您对输入有所了解,通常可以比O(n*lg(n))排序更好.基本上查找Radix Sort,Bucket Sort,Counting Sort等.有很多方案.一般来说,如果可以使用其中一种进行排序,你应该....
**其他种类:**还有许多其他种类可供选择.像shell排序等等...上面的那些更常见.
但无论如何,实际上更快的算法通常更难实现.如果有人告诉我在没有图书馆的情况下在20分钟内对这些数字进行排序,我可能会选择排序.更复杂的更容易出错.而且往往需要额外的空间.您必须评估复杂性,空间和时间权衡.许多编程语言都内置了排序库.
还有一点需要注意的是排序是否稳定.基本上如果你有A,C,D,C,G,C将使每个C按顺序出现,或者最后一个C出现在其他C之一之前.如果要对多个字段进行排序,这很重要.即如果你按名字和姓氏排序(Alex Rodriguez,Jane Rodriguez,Betty Rodriguez)......首先你会得到(Alex R,Betty R,Jane R).第二种如果它稳定你会得到Alex R,Betty R,Jane R.如果它不稳定,你可以获得任何订单.通常,气泡和插入易于实现以保持稳定.堆排序和快速排序通常不稳定.合并排序很容易实现稳定.这也是选择的因素....
此外,如果您不知道O(n)表示法,基本上它是计算所需计算量的上限.为了给你一个想法,你可以用O(n*lg(n))对你正在查看大约400个操作的20个项目进行排序,你会看到20*大约4.3,所以大约有86个操作.对于lg(n)你看4.3左右.无论如何,数字越大,这个差异越大.对于n*lg(n),10000个项目是133000个操作,对于n ^ 2,是100000000个.对于使用较慢排序的大型列表开始变得不切实际.当然O(n)只有10,000.操作的数量并不完全是那些数字,但它们说明它的增长速度.即只需lg(n),你就可以从4.3增长到20,增加到133000.随着你从n增长到20,你从n增长到10000,你从86增长到133000,n ^ 2你从400增长到100000000.
无论如何把它全部放在上下文中我看到冒泡排序的以下优点:
无论如何,在库中快速排序和稳定合并排序似乎是最受欢迎的.
BubbleSort 比已经排序的列表上的QuickSort (以及几乎所有其他类型)更快 ;-)
QuickSort的最佳表现是O(N log N),BubbleSort是O(N)!
除了这种异国情调外,我不得不同意Donald Knuth,"计算机编程艺术",Vol.3:排序和搜索:
简而言之,泡沫排序似乎没有什么可推荐的,除了一个吸引人的名字和它导致一些有趣的理论问题的事实
| 归档时间: |
|
| 查看次数: |
3012 次 |
| 最近记录: |