十大排序算法
经典排序
def puzzle_sort(lst):
n=len(lst)
for i in range(n-1):
for j in range(i+1,n):
if lst[i]>lst[j]:
lst[i],lst[j]=lst[j],lst[i]
冒泡排序
def bubble_sort(lst):
n=len(lst)
for i in range(n):
for j in range(1,n-i):
if lst[j-1]>lst[j]:
lst[j-1],lst[j]=lst[j],lst[j-1]
选择排序
#此处为选择排序,首先挑出最小的,逐渐遍历选择最小的
def selection_sort(lst):
n=len(lst)
for i in range(n-1):
min_index=i
for j in range(i+1,n):
if lst[j]<lst[min_index]:
min_index=j
lst[i],lst[min_index]=lst[min_index],lst[i]
return lst
快速排序
#此处为选择排序,首先挑出最小的,逐渐遍历选择最小的
def quick_sort(lst):
n=len(lst)
if n<=1:
return lst
baseline=lst[0]
left=[lst[i] for i in range(1,len(lst)) if lst[i]<baseline]
right=[lst[i] for i in range(1,len(lst)) if lst[i]>=baseline]
return quick_sort(left)+[baseline]+quick_sort(right)
归并排序
def merge_sort(lst):
n=len(lst)
if n<=1:
return lst
mid=n//2
left=lst[:mid]
right=lst[mid:]
left=merge_sort(left)
right=merge_sort(right)
res=[]
i=j=0
while i<len(left) and j <len(right):
if left[i]>right[j]:
res.append(right[j])
j+=1
else:
res.append(left[i])
i+=1
res+=left[i:]+right[j:]
return res
#版本二
def merge_sort(lst):
def merge(left,right):
#此处采取双指针的思想来进行运算
i=j=0
result=[]
while i<len(left)&j<len(right):
if left[i]<=right[j]:
result.append(left[i])
i+=1
else:
result.append(right[j])
j+=1
result+=left[i:]+right[j:]
return result
n=len(lst)
if n<=1:
return lst
mid=n>>1
left=merge_sort(lst[:mid])
right=merge_sort(lst[mid:])
return merge(left,right)
插入排序
def insertion_sort(lst):
for i in range(1,len(lst)):
cur_index=i
while cur_index-1>=0 and lst[cur_index-1]>lst[cur_index]:
lst[cur_index-1],lst[cur_index]=lst[cur_index],lst[cur_index-1]
cur_index-=1
return lst
希尔排序
def shell_sort(lst):
n=len(lst)
gap=n//2
while gap:
for i in range(gap,n):
ind=i
while (ind>=gap)&(lst[ind]<lst[ind-gap]):
lst[ind],lst[ind-gap]=lst[ind-gap],lst[ind]
ind-=gap
gap//=2
return lst
总结
难的雅痞。其他排序不会。