各种排序算法_python

本文详细介绍了使用Python实现的五种经典排序算法:插入排序、冒泡排序、归并排序、堆排序和快速排序。每种算法均附带了完整的源代码,并解释了其基本原理、时间复杂度及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用python实现各种排序(插入、冒泡、归并、堆、快排)。

1、插入排序:

进行N-1次插入,通过比较将key插入已经排好序的子数组。

  1 #! /usr/bin/python
  2 #_*_ coding:utf8
  3 #the insert sort algorithm
  4 #非降序
  5 #O(N2)
  6 
  7 import sys
  8 
  9 def insert_sort(sourse):
 10     i=1  #the cursor
 11     for i in range(len(sourse)):
 12         sourse[i]=int(sourse[i])
 13     print "before:"
 14     print sourse
 15     for i in range(1,len(sourse)):
 16         key=sourse[i]
 17         j=i
 18         #insert the key into sourse[0~i-1],which is sorted already
 19         while sourse[j-1]>key and j>0:
 20             sourse[j]=sourse[j-1]
 21             j-=1
 22         sourse[j]=key
 23     print "after:"
 24     print sourse
 25     return
 26 
 27 if __name__=='__main__':
 28     sourse=sys.argv[1:]
 29     insert_sort(sourse)


2、冒泡排序:

进行N-1轮冒泡排序,通过比较相邻的元素,每轮选出剩下中最小的数存在最左边。

  1 #! /usr/bin/python
  2 # _*_ coding: utf8
  3 #冒泡排序,O(N2),稳定,代码简单
  4 
  5 import sys
  6 
  7 def buddleSort(A):
  8     #进行len(A)-1次冒泡排序
  9     for i in range(len(A)-1):
 10         #每次冒泡排序都将最小的这轮中选出的最小的数排到这轮的最左端
 11         for j in range(len(A)-1,i,-1):
 12             if A[j-1]>A[j]:
 13                 A[j-1],A[j]=A[j],A[j-1]
 14     return
 15 
 16 
 17 if __name__=='__main__':
 18     A=sys.argv[1:]
 19     for i in range(len(A)):
 20         A[i]=int(A[i])
 21     buddleSort(A)
 22     print A

3、归并排序:

分治法思想,排序A就是排序A1和A2并将A1和A2归并的过程,如此分解下去,最后子数组就只有一个元素,很容易解决排序(不用排了)。那么归并排序的复杂度都体现在归并的过程。采用递归的方式体现分治的过程。

  1 #! /usr/bin/python
  2 # _*_ coding: utf8
  3 #归并排序过程,其中最重要的就是子过程:MERGE(合并过程)
  4 #O(N*lgN)
  5 
  6 import sys
  7 
  8 #合并两个有序的子数组
  9 def merge(A,p,q,r):
 10     n1=q-p+1
 11     n2=r-q
 12     A1=[]
 13     A2=[]
 14     j=0
 15     k=0
 16     #注意添加在子数组的最后添加哨兵位,这样就不用检查哪个子数组匹配完了,简化了代码
 17     for i in range(n1):
 18         A1.append(A[p+i])
 19     A1.append(sys.float_info.max)
 20     for i in range(n2):
 21         A2.append(A[q+i+1])
 22     A2.append(sys.float_info.max)
 23     for i in range(p,r+1):
 24         if A1[j]<=A2[k]:
 25             A[i]=A1[j]
 26             j+=1
 27         else:
 28             A[i]=A2[k]
 29             k+=1
 30     return
 31 
 32 #主程序,分治法
 33 def merge_sort(A,p,r):
 34     if p<r:
 35         q=(p+r)/2
 36         merge_sort(A,p,q)
 37         merge_sort(A,q+1,r)
 38         merge(A,p,q,r)
 39     return
 41 if __name__=='__main__':
 42     A=sys.argv[1:]
 43     for i in range(len(A)):
 44         A[i]=int(A[i])
 45     merge_sort(A,0,len(A)-1)
 46     print A


4、堆排序:

采用最大堆结构,首先建立大根堆,将堆顶元素和最后一个元素交换并获取堆顶元素。然后将换过后的满二叉树调成为大根堆,继续上序过程。

  1 #! /usr/bin/python
  2 # _*_ coding: utf8
  3 #堆派序,O(NlgN)
  4 
  5 import sys
  6 
  7 #主要的子过程,将A中以第i个节点为根的子树成为最大堆,前提是这个子树的左子树和右子树已经是大根堆了,i的范围是从1到len(A)。里面有个递归的过程,O(lgN)
  8 def heap_MAX_i(A,i):
  9     left=i*2
 10     right=i*2+1
 11     largest=i
 12     if left<=len(A) and A[left-1]>A[i-1]:
 13         largest=left
 14     if right<=len(A) and A[right-1]>A[largest-1]:
 15         largest=right
 16     if largest<>i:
 17         A[i-1],A[largest-1]=A[largest-1],A[i-1]
 18         heap_MAX_i(A,largest)
 19     return
 20 
 21 #建立大根堆,O(N),从最后一个非叶子节点开始到根节点
 22 def make_heap_MAX(A):
 23     for i in range(len(A)/2,0,-1):
 24         heap_MAX_i(A,i)
 25 
 26 #堆排序O(N*lgN)
 27 def heap_sort(A):
 28     make_heap_MAX(A)#第一步,建立大根堆
 29     outcome=[]
 30     length=len(A)
 31     for i in range(length,1,-1):
 32         A[i-1],A[0]=A[0],A[i-1]
 33         outcome.append(A.pop())#将堆顶和最后一个节点交换并获取这个堆顶元素
 34         heap_MAX_i(A,1)
 35     outcome.append(A[0])
 36     print outcome
 37 
 38 if __name__=='__main__':
 39     A=sys.argv[1:]
 40     for i in range(len(A)):
 41         A[i]=int(A[i])
 42     heap_sort(A)
5、快排:

分治法思想,这次主要过程不是归并了,而是分解的过程,A分解成A1和A2中的所有元素都小于中的任意元素,其中已经排好序。

  1 #! /usr/bin/python
  2 #_*_ coding: utf8
  3 #快速排序,0(NlgN)
  4 
  5 import sys
  6 
  7 #数组就地划分
  8 def partition(A,p,r):
  9     x=A[r]
 10     i=p-1
 11     for j in range(p,r):
 12         if A[j]<=x:
 13             i+=1
 14             A[i],A[j]=A[j],A[i]
 15     A[i+1],A[r]=A[r],A[i+1]
 16     return i+1
 17 
 18 #快排,主要就是划分过程
 19 def quick_sort(A,p,r):
 20     if p<r:
 21         q=partition(A,p,r)
 22         quick_sort(A,p,q-1)
 23         quick_sort(A,q+1,r)
 24 
 25 
 26 if __name__=='__main__':
 27     A=sys.argv[1:]
 28     for i in range(len(A)):
 29         A[i]=int(A[i])
 30     quick_sort(A,0,len(A)-1)
 31     print A


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值