[Python]插入排序,快速排序,冒泡排序

来源:本网整理

设待排序随机分布且元素个数充分多时,在插入排序,冒泡排序,快速排序,选择排序,归并排序中,平均比较次

就是写了脑图式的代码,没有做任何代码重构,不喜勿喷!谢谢 scrolltotop.offset(100,120); scrolltotop.init();

[1].[代码] [Python]代码 跳至 [1]

#encoding=utf-8 ''' Created on 2016-8-18 @author: cooler ''' import sys,os,time reload(sys) sys.setdefaultencoding('utf8') def qsort(l,i,j): a ,b =i,j tmp = l[i] while i<j: if l[j] < tmp: l[i] = l[j] i += 1 l[j]=l[i] else: j -= 1 l[i] = tmp if a<i: qsort(l,a,i) if i+1<b: qsort(l,i+1,b) # print l def isort(l): for x in range(len(l)): tmp_index = x for y in range(x+1,len(l)): if l[tmp_index] > l[y]: tmp_index = y l[tmp_index], l[x]= l[x],l[tmp_index] # return l def msort(l): for i in range(len(l)-1,0,-1): for x in range(i): if l[x] > l[x+1]: l[x],l[x+1] = l[x+1],l[x] # print l if __name__ == '__main__': l = [42,2,3,6,98,6,8,2,44,35,62,3] print l qsort(l,0,len(l)-1) print l isort(l) print l msort(l) print l SyntaxHighlighter.autoloader( 'applescript /js/sh309/scripts/shBrushAppleScript.js?t=1451961936000', 'actionscript3 as3 /js/sh309/scripts/shBrushAS3.js?t=1451961936000', 'bash shell /js/sh309/scripts/shBrushBash.js?t=1451961936000', 'coldfusion cf /js/sh309/scripts/shBrushColdFusion.js?t=1451961936000', 'cpp c /js/sh309/scripts/shBrushCpp.js?t=1451961936000', 'obj-c objc /js/sh309/scripts/shBrushObjC.js?t=1451961936000', 'c# c-sharp csharp /js/sh309/scripts/shBrushCSharp.js?t=1451961936000', 'css /js/sh309/scripts/shBrushCss.js?t=1451961936000', 'delphi pascal /js/sh309/scripts/shBrushDelphi.js?t=1451961936000', 'diff patch pas /js/sh309/scripts/shBrushDiff.js?t=1451961936000', 'erl erlang /js/sh309/scripts/shBrushErlang.js?t=1451961936000', 'groovy /js/sh309/scripts/shBrushGroovy.js?t=1451961936000', 'haxe hx /js/sh309/scripts/shBrushHaxe.js?t=1451961936000', 'java /js/sh309/scripts/shBrushJava.js?t=1451961936000', 'jfx javafx /js/sh309/scripts/shBrushJavaFX.js?t=1451961936000', 'js jscript javascript /js/sh309/scripts/shBrushJScript.js?t=1451961936000', 'perl pl /js/sh309/scripts/shBrushPerl.js?t=1451961936000', 'php /js/sh309/scripts/shBrushPhp.js?t=1451961936000', 'text plain /js/sh309/scripts/shBrushPlain.js?t=1451961936000', 'py python /js/sh309/scripts/shBrushPython.js?t=1451961936000', 'ruby rails ror rb /js/sh309/scripts/shBrushRuby.js?t=1451961936000', 'scala /js/sh309/scripts/shBrushScala.js?t=1451961936000', 'sql /js/sh309/scripts/shBrushSql.js?t=1451961936000', 'vb vbnet /js/sh309/scripts/shBrushVb.js?t=1451961936000', 'xml xhtml xslt html /js/sh309/scripts/shBrushXml.js?t=1451961936000' ); SyntaxHighlighter.all();

改进型冒泡排序算法:时间复杂度为 O(n^2): 非改进型没有最优情况最优情况是O(n):整个序

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

冒泡排序,插入排序,选择排序,快速排序的速度大小比较

一般来说,快排》冒泡》插入=选择;

但快排抵抗垃圾数据能力太差;

推荐用归并排序,速度仅次于快排,抵抗垃圾数据的能力较强本回答被提问者采纳

写出冒泡排序选择排序插入排序归并排序快速排序在最坏最坏及平均情况下的时间复杂度

冒泡排序,选择排序,插入排序一般情况下要经过两次循环,每次循环必须经历时则需要O(n^2)。而归并排序,快速排序则是O(n log2 n)。

而最坏情况下,快速排序会变成O(n^2),其余不变(优化除外)。

望采纳!!

选择排序,快速排序,冒泡排序,堆排序,插入排序,基排序的程序的运行速度

分析如下:

冒泡排序:在最优情况下只需要经过n-1次比较即可得出结果,(这个最优情况那就是序列己是正序,从100K的正序结果可以看出结果正是如此),但在最坏情况下,即倒序(或一个较小值在最后),下沉算法将需要n(n-1)/2次比较。所以一般情况下,特别是在逆序时,它很不理想。它是对数据有序性非常敏感的排序算法。

冒泡排序2:它是冒泡排序的改良(一次下沉再一次上浮),最优情况和最坏情况与冒泡排序差不多,但是一般情况下它要好过冒泡排序,它一次下沉,再一次上浮,这样避免了因一个数的逆序,而造成巨大的比较。如(2,3,4,…,n-1,n,1),用冒泡排序需要n(n-1)/2次比较,而此排序只要3轮,共比较(n-1)+(n-2)+(n-3)次,第一轮1将上移一位,第二轮1将移到首位,第三轮将发现无数据交换,序列有序而结束。但它同样是一个对数据有序性非常敏感的排序算法,只适合于数据基本有序的排序。

快速排序:它同样是冒泡排序的改进,它通过一次交换能消除多个逆序,这样可以减少逆序时所消耗的扫描和数据交换次数。在最优情况下,它的排序时间复杂度为O(nlog2n)。即每次划分序列时,能均匀分成两个子串。但最差情况下它的时间复杂度将是O(n^2)。即每次划分子串时,一串为空,另一串为m-1(程序中的100K正序和逆序就正是这样,如果程序中采用每次取序列中部数据作为划分点,那将在正序和逆时达到最优)。从100K中正序的结果上看“快速排序”会比“冒泡排序”更慢,这主要是“冒泡排序”中采用了提前结束排序的方法。有的书上这解释“快速排序”,在理论上讲,如果每次能均匀划分序列,它将是最快的排序算法,因此称它作快速排序。虽然很难均匀划分序列,但就平均性能而言,它仍是基于关键字比较的内部排序算法中速度最快者。

直接选择排序:简单的选择排序,它的比较次数一定:n(n-1)/2。也因此无论在序列何种情况下,它都不会有优秀的表现(从上100K的正序和反序数据可以发现它耗时相差不多,相差的只是数据移动时间),可见对数据的有序性不敏感。它虽然比较次数多,但它的数据交换量却很少。所以我们将发现它在一般情况下将快于冒泡排序。

堆排序:由于它在直接选择排序的基础上利用了比较结果形成。效率提高很大。它完成排序的总比较次数为O(nlog2n)。它是对数据的有序性不敏感的一种算法。但堆排序将需要做两个步骤:-是建堆,二是排序(调整堆)。所以一般在小规模的序列中不合适,但对于较大的序列,将表现出优越的性能。

直接插入排序:简单的插入排序,每次比较后最多移掉一个逆序,因此与冒泡排序的效率相同。但它在速度上还是要高点,这是因为在冒泡排序下是进行值交换,而在插入排序下是值移动,所以直接插入排序将要优于冒泡排序。直接插入法也是一种对数据的有序性非常敏感的一种算法。在有序情况下只需要经过n-1次比较,在最坏情况下,将需要n(n-1)/2次比较。

希尔排序:增量的选择将影响希尔排序的效率。但是无论怎样选择增量,最后一定要使增量为1,进行一次直接插入排序。但它相对于直接插入排序,由于在子表中每进行一次比较,就可能移去整个经性表中的多个逆序,从而改善了整个排序性能。希尔排序算是一种基于插入排序的算法,所以对数据有序敏感。

归并排序:归并排序是一种非就地排序,将需要与待排序序列一样多的辅助空间。在使用它对两个己有序的序列归并,将有无比的优势。其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlog2n)。对数据的有序性不敏感。若数据节点数据量大,那将不适合。但可改造成索引操作,效果将非常出色。

基数排序:在程序中采用的是以数值的十进制位分解,然后对空间采用一次性分配,因此它需要较多的辅助空间(10*n+10), (但我们可以进行其它分解,如以一个字节分解,空间采用链表将只需辅助空间n+256)。基数排序的时间是线性的(即O(n))。由此可见,基数排序非常吸引人,但它也不是就地排序,若节点数据量大时宜改为索引排序。但基数排序有个前提,要关键字能象整型、字符串这样能分解,若是浮点型那就不行了。

按平均时间将排序分为类:

(1) 平方阶(O(n2))排序

各类简单排序,例如直接插入、直接选择和冒泡排序;

(2) 线性对数阶(O(nlog2n))排序

如快速排序、堆排序和归并排序;

(3) O(n1+§))排序

§是介于0和1之间的常数。希尔排序便是一种;

(4) 线性阶(O(n))排序

本程序中的基数排序,此外还有桶、箱排序。

排序方法的选择

因为不同的排序方法适应不同的应用环境和要求,所以选择合适的排序方法很重要

(1)若n较小,可采用直接插入或直接选择排序。

当记录规模较小时,直接插入排序较好,它会比选择更少的比较次数;

但当记录规模较大时,因为直接选择移动的记录数少于直接插人,所以宜用选直接选择排序。

这两种都是稳定排序算法。

(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜(这里的随机是指基准取值的随机,原因见上的快速排序分析);这里快速排序算法将不稳定。

(3)若n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。

快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;

堆排序虽不会出现快速排序可能出现的最坏情况。但它需要建堆的过程。这两种排序都是不稳定的。

归并排序是稳定的排序算法,但它有一定数量的数据移动,所以我们可能过与插入排序组合,先获得一定长度的序列,然后再合并,在效率上将有所提高。

(4)特殊的箱排序、基数排序

它们都是一种稳定的排序算法,但有一定的局限性:

1、关键字可分解。

2、记录的关键字位数较少,如果密集更好

3、如果是数字时,最好是无符号的,否则将增加相应的映射复杂度,可先将其正负分开排序。

事实上各种排序方法个有优缺点适用于不同的场合:

排序(Sorting)

插入排序(insertion sort):直接插入排序 希尔排序(shell's sort)(缩小增量排序Diminishing increment sort)

交换排序:冒泡排序(bubble sort)快速排序(quick sort)

选择排序:直接选择排序(straight selection sort),堆排序;

归并排序(merge sort):

分配排序:箱排序(Bin sort),基数排序(radix sort)

更多的自己研究一下。

排序方法的选取主要考虑算法的性能与资源占用。也就是速度和占用的存储空间。

希望对你有所帮助!

对序列1,2,3,4,5进行排序,用堆排序、快速排序、冒泡排序和归并排序进行排序,分别需要进行几趟排序

1、插入排序(直接插入排序和希尔排序)

2、选择排序(直接选择排序和堆排序)

3、交换排序(冒泡排序和快速排序)

4、归并排序

5、基数排序

直接插入排序:逐个将后一个数加到前面的排好的序中。在直接插入排序过程中,对其中一个记录的插入排序称为一次排序;直接插入排序是从第二个记录开始进行的,因此,长度为n的记录序列需要进行n-1次排序才能完成整个序列的排序。时间复杂度为O(n2)。

希尔排序:希尔排序又称缩小增量排序,增量di可以有各种不同的取法,但最后一次排序时的增量必须为1,最简单可取di+1=di/2(取小)。时间复杂度为O(n(log2n)2)。

直接选择排序

说明:每次将后面的最小的找出来插入前面的已排好的序中。同理,具有n个记录的序列要做n-1次排序。

时间复杂度为O(n2)。

冒泡排序:两个两个比较,将大的往后移。通过第一次冒泡排序,使得待排序的n个记录中关键字最大的记录排到了序列的最后一个位置上。然后对序列中前n-1个记录进行第二次冒泡排序。。。对于n个记录的序列,共需进行n次冒泡排序。时间复杂度为O(n2)。

快速排序:又叫分区交换排序,是对冒泡排序方法的一种改进。时间复杂度为O(nlog2n)。

归并排序:将两个或两个以上的有序数据序列合并成一个有序数据序列的过程。时间复杂度为O(nlog2n)。

  • 本文相关:
  • [PHP]把长数字转为短字??/a> [PHP]
  • [JavaScript]响应??/a> [JavaScript]
  • [C#]C#实现短信验证码接口示??/a> [C#]
  • [Python]基于python的短信接口调用代码示例模??/a> [Python]
  • [JavaScript]火狐下鼠标滚轮事??/a> [JavaScript]
  • [XML]简单计算器源码
  • [Java]StringTokenizer分解字符串实??/a> [Java]
  • [Objective-C]对AFNetworking 3.x 与YYCache二次封装,一句话??..
  • [Java]struts2中实现实通过超链接切换语言. ...
  • [JavaScript]jQuery复合事件
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved