用 python 实现各种排序算法
发布时间:2020-12-17 17:27:34 所属栏目:Python 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 归并排序 #!/usr/bin/python import sys def merge(nums,first,middle,last): ''''' merge ''' # 切片边界,左闭右开并且是了0为开始 lnums = nums[fir
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 归并排序#!/usr/bin/python import sys def merge(nums,first,middle,last): ''''' merge ''' # 切片边界,左闭右开并且是了0为开始 lnums = nums[first:middle+1] rnums = nums[middle+1:last+1] lnums.append(sys.maxint) rnums.append(sys.maxint) l = 0 r = 0 for i in range(first,last+1): if lnums[l] < rnums[r]: nums[i] = lnums[l] l+=1 else: nums[i] = rnums[r] r+=1 def merge_sort(nums,last): ''''' merge sort merge_sort函数中传递的是下标,不是元素个数 ''' if first < last: middle = (first + last)/2 merge_sort(nums,middle) merge_sort(nums,middle+1,last) merge(nums,last) if __name__ == '__main__': nums = [10,8,4,-1,2,6,7,3] print 'nums is:',nums merge_sort(nums,7) print 'merge sort:',nums 插入排序#!/usr/bin/python import sys def insert_sort(a): ''''' 插入排序 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数, 但要求插入后此数据序列仍然有序。刚开始 一个元素显然有序,然后插入一 个元素到适当位置,然后再插入第三个元素,依次类推 ''' a_len = len(a) if a_len = 0 and a[j] > key: a[j+1] = a[j] j-=1 a[j+1] = key return a if __name__ == '__main__': nums = [10,nums insert_sort(nums) print 'insert sort:',nums 选择排序import sys def select_sort(a): ''''' 选择排序 每一趟从待排序的数据元素中选出最小(或最大)的一个元素, 顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。 ''' a_len=len(a) for i in range(a_len):#在0-n-1上依次选择相应大小的元素 min_index = i#记录最小元素的下标 for j in range(i+1,a_len):#查找最小值 if(a[j]<a[min_index]): min_index=j if min_index != i:#找到最小元素进行交换 a[i],a[min_index] = a[min_index],a[i] if __name__ == '__main__': A = [10,-3,5,1,3,7] print 'Before sort:',A select_sort(A) print 'After sort:',A 希尔排序import sys def shell_sort(a): ''''' shell排序 ''' a_len=len(a) gap=a_len/2#增量 while gap>0: for i in range(a_len):#对同一个组进行选择排序 m=i j=i+1 while j<a_len: if a[j]<a[m]: m=j j+=gap#j增加gap if m!=i: a[m],a[i]=a[i],a[m] gap/=2 if __name__ == '__main__': A = [10,A shell_sort(A) print 'After sort:',A 堆排序 ( Heap Sort )#!/usr/bin env python # 数组编号从 0开始 def left(i): return 2*i +1 def right(i): return 2*i+2 #保持最大堆性质 使以i为根的子树成为最大堆 def max_heapify(A,i,heap_size): if heap_size <= 0: return l = left(i) r = right(i) largest = i # 选出子节点中较大的节点 if l A[largest]: largest = l if r A[largest]: largest = r if i != largest :#说明当前节点不是最大的,下移 A[i],A[largest] = A[largest],A[i] #交换 max_heapify(A,largest,heap_size)#继续追踪下移的点 #print A # 建堆 def bulid_max_heap(A): heap_size = len(A) if heap_size >1: node = heap_size/2 -1 while node >= 0: max_heapify(A,node,heap_size) node -=1 # 堆排序 下标从0开始 def heap_sort(A): bulid_max_heap(A) heap_size = len(A) i = heap_size - 1 while i > 0 : A[0],A[i] = A[i],A[0] # 堆中的最大值存入数组适当的位置,并且进行交换 heap_size -=1 # heap 大小 递减 1 i -= 1 # 存放堆中最大值的下标递减 1 max_heapify(A,heap_size) if __name__ == '__main__' : A = [10,7] print 'Before sort:',A heap_sort(A) print 'After sort:',A 快速排序#!/usr/bin/env python # 快速排序 ''''' 划分 使满足 以A[r]为基准对数组进行一个划分,比A[r]小的放在左边, 比A[r]大的放在右边 快速排序的分治partition过程有两种方法, 一种是上面所述的两个指针索引一前一后逐步向后扫描的方法,另一种方法是两个指针从首位向中间扫描的方法。 ''' #p,r 是数组A的下标 def partition1(A,p,r): ''''' 方法一,两个指针索引一前一后逐步向后扫描的方法 ''' x = A[r] i = p-1 j = p while j < r: if A[j] < x: i +=1 A[i],A[j] = A[j],A[i] j += 1 A[i+1],A[r] = A[r],A[i+1] return i+1 def partition2(A,r): ''''' 两个指针从首尾向中间扫描的方法 ''' i = p j = r x = A[p] while i = x and i < j: j -=1 A[i] = A[j] while A[i]<=x and i < j: i +=1 A[j] = A[i] A[i] = x return i # quick sort def quick_sort(A,r): ''''' 快速排序的最差时间复杂度为O(n2),平时时间复杂度为O(nlgn) ''' if p < r: q = partition2(A,r) quick_sort(A,q-1) quick_sort(A,q+1,r) if __name__ == '__main__': A = [5,-4,11,2] print 'Before sort:',A quick_sort(A,7) print 'After sort:',A 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |