常见排序算法–python实现
【1】稳定性是指序列中相同的数字在排序后相对位置不发生改变
【2】常见的且稳定的排序算法有冒泡、归并、插入,其余的为非稳定的排序算法
冒泡排序
def bubble_sort(alist):
for j in range(len(alist)-1,0,-1):
for i in range(j):
if alist[i]>alist[i+1]:
alist[i],alist[i+1] = alist[i+1],alist[i]
li = [54,26,93,17,77,31,44,55,20]
bubble_sort(li)
print(li)
归并排序
def merge_sort(alist):
n = len(alist)
if n <=1:
return alist
num = n //2
left = merge_sort(alist[:num])
right = merge_sort(alist[num:])
return merge(left,right)
def merge(left,right):
l,r = 0,0
res = []
while l <len(left) and r <len(right):
if left[l] < right[r]:
res.append(left[l])
l+=1
else:
res.append(right[r])
r+=1
res+=left[l:]
res+=right[r:]
return res
alist = [54,26,93,17,77,31,44,55,20]
sorted_alist = merge_sort(alist)
print(sorted_alist)
插入排序
插入排序 简单记做 ‘在有序的序列中插入值’
def insert_sort(alist):
n = len(alist)
for i in range(1,n):
for j in range(i,0,-1):
if alist[j] <alist[j-1]:
alist[j],alist[j-1] = alist[j-1],alist[j]
alist = [54,26,93,17,77,31,44,55,20]
insert_sort(alist)
print(alist)
希尔排序
一种改进的插入排序
def shell_sort(alist):
n = len(alist)
gap = n //2
while gap >0:
for i in range(gap,n):
j = i
while j >= gap and alist[j-gap] > alist[j]:
alist[j],alist[j-gap] = alist[j-gap],alist[j]
j-=gap
gap= gap//2
alist = [54,26,93,17,77,31,44,55,20]
shell_sort(alist)
print(alist)
选择排序
在未排序中搜索到最值放在序列起始位置
def select_sort(alist):
n = len(alist)
for i in range(n-1):
minindex = i
for j in range(i+1,n):
if alist[j] <alist[minindex]:
minindex = j
if minindex != i:
alist[minindex],alist[i] = alist[i],alist[minindex]
li = [54,26,93,17,77,31,44,55,20]
select_sort(li)
print(li)
快速排序
def quick(alist):
n = len(alist)
if n <2:
return alist
else:
base = alist[0]
left = [i for i in alist[1:] if alist[i]<base]
right = [i for i in alist[1:] if alist[i]>base]
return left + [base] + right
alist = [54,26,93,17,77,31,44,55,20]
alist1 = quick_sort(alist)
print(alist1)