用 python 实现各种排序算法
发布时间:2020-05-25 16:37:14 所属栏目:Python 来源:互联网
导读:用 python 实现各种排序算法
|
下面是脚本之家 jb51.cc 通过网络收集整理的代码片段。 脚本之家小编现在分享给大家,也给大家做个参考。 归并排序#!/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
以上是脚本之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。 如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
