选择排序
#快速排序
def kuaisu(a,low,high):
if low>high:
return
left=low
right=high
flag=a[low]
while(left<right):
while (right>left and a[right]>=flag):
right-=1
a[left]=a[right]
while(right>left and a[left]<flag):
left+=1
a[right]=a[left]
a[left]=flag
kuaisu(a,low,left-1)
kuaisu(a,right+1,high)
a=[1,5,3,6,7,2,1]
kuaisu(a,0,len(a)-1)
思路
1.先确定一个基准数(flag),通常为第一个元素。将left指向第一个元素,right指向最后一个元素。
2.从右边开始,向前遍历找到第一个小于基准数的元素,下标为right,赋值给left指向的节点
3.left不动,从左边开始,向后遍历找到第一个大于基准数的元素,下标为left,赋值给right指向的节点
4.重复2,3直到left==right时停止,此时将基准数赋值给下标为left(right)的节点。此时基准数左边的数都比他小,右边都比他大。
5.将基准数左边的数组段,和右边的数组段分别重复1,2,3,4,5(递归)操作。
注意点:
1.递归的结束条件是传入的开始下标大于等于结束下标
2.出现与基准数相同的数,当作大于基准数处理
希尔排序
def Xier(a):
length=len(a)
grad=length//2
while (grad>0):
for i in range(grad,length):
j=i
flag=a[i]
while j>grad and a[j-grad]>a[j]:
a[j]=a[j-grad]
j-=grad
a[j]=flag
grad//=2
a=[1,5,2,7,3]
Xier(a)
print(a)