常见6种排序算法的python实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

常用排序算法的Python实现相关代码如下(直接拷贝就可以用了):importrandomimportmath'''冒泡排序''''''多次比较相邻的两个元素若第一个比第二个大则交换持续进行比较直到没有需要交换的元素为止'''defbubbleSort(num):length=len(num)whilelength0:foriinrange(length-1):ifnum[i]num[i+1]:num[i],num[i+1]=num[i+1],num[i]length=length-1passprint(num)returnnum'''选择排序''''''每一次从待排序的数据元素中选出最小(或最大)的一个元素存放在序列的起始位置直到全部待排序的数据元素排完'''defselectSort(num):length=len(num)foriinrange(length):tmpNum=iforjinrange(i,length):ifnum[tmpNum]num[j]:num[tmpNum],num[j]=num[j],num[tmpNum]print(num)returnnum'''插入排序''''''将一个数据插入到已经排好序的有序数据中从而得到一个新的、个数加一的有序数据''''''实现方法一'''definsertSort(num):length=len(num)foriinrange(1,length):tmp=num[i]forjinrange(i,-1,-1):ifnum[j]tmp:num[j+1],num[j]=num[j],num[j+1]print(num)returnnum'''实现方法二'''definsertSort2(num):length=len(num)foriinrange(1,length):tmp=num[i]tmpi=i-1whiletmpi=0andnum[tmpi]tmp:num[tmpi],num[tmpi+1]=num[tmpi+1],num[tmpi]tmpi=tmpi-1passprint(num)returnnum'''快速排序''''''通过一趟排序将要排序的数据分割成独立的两部分其中一部分的所有数据都比另外一部分的所有数据都要小然后再按此方法对这两部分数据分别进行快速排序'''defquickSort(num):length=len(num)iflength=1:returnnumtmpi=random.randint(0,length-1)tmp=num[tmpi]left=[]right=[]foriinrange(0,length):ifnum[i]tmp:right.append(num[i])else:left.append(num[i])returnquickSort(left)+quickSort(right)'''归并排序''''''归并排序采用的分治法,将有序的序列合成一个序列,反之,将当前序列分成多个序列分别排序,依此方法类推,直到序列中只有一个元素为止,常用的归并排序为二路归并,即分成两个序列'''defmergerSort(num):result=[]length=len(num)iflength=1:returnnumleft=mergerSort(num[:math.floor(length/2)])right=mergerSort(num[math.floor(length/2):])whilelen(left)0andlen(right)0:ifleft[0]=right[0]:result.append(left.pop(0))else:result.append(right.pop(0))iflen(left)0:result.extend(left)else:result.extend(right)returnresult'''堆排序''''''堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。主要的过程分为建立堆、堆调整和堆排序。建立堆:建堆是不断调整堆的过程,从len/2处开始调整,一直到第一个节点,此处len是堆中元素的个数。'''defcreateHeap(num):length=len(num)flag=1foriinrange(math.floor(length/2)-1,-1,-1):ifnum[2*i+2]num[i]andnum[2*i+2]num[2*i+1]:num[2*i+2],num[i]=num[i],num[2*i+2]num=handHeap(num,2*i+2)else:ifnum[2*i+1]num[i]andnum[2*i+1]num[2*i+2]:num[2*i+1],num[i]=num[i],num[2*i+1]num=handHeap(num,2*i+1)else:num[i]=num[i]returnnum'''调整堆:利用的思想是比较节点i和它的孩子节点left(i),right(i),选出三者最大(或者最小)者,如果最大(小)值不是节点i而是它的一个孩子节点,那边交互节点i和该节点,然后再调用调整堆过程,这是一个递归的过程。'''defhandHeap(num,head):temp=2*head+1tempHead=headlength=len(num)whiletemplength:ifnum[tempHead]num[temp]:num[tempHead],num[temp]=num[temp],num[tempHead]iftemp+1lengthandnum[tempHead]num[temp+1]:num[tempHead],num[temp+1]=num[temp+1],num[tempHead]tempHead=temptemp=tempHead*2+1returnnum'''堆排序:堆排序是利用上面的两个过程来进行的。首先是根据元素构建堆。然后将堆的根节点取出(一般是与最后一个节点进行交换),将前面len-1个节点继续进行堆调整的过程,然后再将根节点取出,这样一直到所有节点都取出。'''defheadSort(num):length=len(num)iflength=1:returnnumtempLength=length-1num=createHeap(num)whiletempLength0:num[tempLength],num[0]=num[0],num[tempLength]num[:tempLength]=handHeap(num[:tempLength],0)tempLength=tempLength-1returnnum'''堆排序结束'''if__name__=='__main__':testlist=[34,31,35,21,43,53,37,94,54,26,51]print(headSort(testlist))

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功