选一个基数,把比这个数大的数放到这个数的左边,比这个数小的放到这个数的右边,然后在采用分治法对左右进行同样的操作。
这个数最后所在的位置即为这个数在这组数中的大小排序。
分治法
def quickSort(ary,left,right):
if (left<right):
index=quickArray(ary,left,right)#先找到某个元素在序列中的大小位置
print(index,ary)
quickSort(ary,left,index-1)#对中间元素两边的序列排序
quickSort(ary,index+1,right)
挖坑法
找一个基数,然后从前面找小于基数的数去填这个坑,再从后往前找大于基数的数填刚形成的坑。
#挖坑法
def quickArray3(ary,left,right):
k=ary[right]#首先
print(ary)
i=left
j=right
while i<j:
while i<j and ary[i]<=k:
i+=1
ary[j]=ary[i]#其实和左右指针看着很相似,其实不一样 哦
while i<j and ary[j]>k:
j-=1
ary[i]=ary[j]
ary[j]=k
return j
左右指针法
找一个基数,前面找比这个数小的数,然后从后面找比这个数大的数,然后两个数对调。
#左右指针
def quickArray2(ary,left,right):
i=left
j=right
print(left,right)
while i<j:
#向后找,直到找到比最后一个元素大的数
while i<j and ary[i]<ary[right]:#i<j不能少啊,因为对i和j进行操作了
i+=1
#然后向前找,直到找到比最后一个元素小的数
while i<j and ary[j]>=ary[right]:
j-=1
ary[i],ary[j]=ary[j],ary[i]#然后两者对换
print(ary)
ary[j],ary[right]=ary[right],ary[j]
print (ary[j])
return j
前后指针法
找一个基数,两个指针分别记录当前位置cur和上一个比基数大的数的位置pre,若当前位置比基数小,则换到前面
def quickArray(ary,left,right):
if left<right:
k=ary[right]
cur=left
pre=cur-1
for cur in range (left,right):
if ary[cur]<k:
pre+=1
if pre!=cur:
ary[pre],ary[cur]=ary[cur],ary[pre]
ary[pre+1],ary[right]=ary[right],ary[pre+1]
print(ary)
return pre+1