python">快速排序
1. 介绍:
快速排序使用分治法策略,把一个串行(list)分为两个子串行(sub - lists)。
快速排序,快,而且效率高!它是处理大数据最快的排序算法之一了。
快排的思想:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,
然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。
2. 一趟快速排序的算法是:
设置两个变量i、j,排序开始的时候:i = 0,j = N - 1;
以第一个数组元素作为关键数据,赋值给key,即key = A[0];
从j开始向前搜索,即由后开始向前搜索(j - -),找到第一个小于key的值A[j],将A[j]和A[i]互换;
从i开始向后搜索,即由前开始向后搜索(i + +),找到第一个大于key的A[i],将A[i]和A[j]互换;
重复第3、4步,直到i = j; (3, 4步中,没找到符合条件的值,即3中A[j]不小于key,
4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,
进行交换的时候i,j指针位置不变。另外,i == j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
3. 复杂度:
时间复杂度:O(nlog₂n)
空间复杂度:O(nlog₂n)
4. 稳定性:不稳定
'''
#方法一:
def quick_sort(myList,start,end):
#判断low是否小于high,如果为false,直接返回
if start < end:
i,j = start,end
#设置基准数
base = myList[i]
while i < j:
#如果列表后边的数,比基准数大或相等,则前移一位直到有比基准数小的数出现
while (i < j) and (myList[j] >= base):
j = j - 1
#如找到,则把第j个元素赋值给第个元素i,此时表中i,j个元素相等
myList[i] = myList[j]
#同样的方式比较前半区
while (i < j) and (myList[i] <= base):
i = i + 1
myList[j] = myList[i]
#做完第一轮比较之后,列表被分成了两个半区,并且i=j,需要将这个数设置回base
myList[i] = base
#递归前后半区
quick_sort(myList, start, i - 1)
quick_sort(myList, j + 1, end)
return myList
list2= [1,5,3,6,7,2]
list3=quick_sort(list2,0,len(list2)-1)
print("快速排序:")
print(list3)
运行结果:
python">快速排序:
[1, 2, 3, 5, 6, 7]
python">#方法二
def quick_sort(list,start,end): #对每一个元素进行排序
count=1
key=list[start]
for i in range(start+1, end+1):
if list[i]<=key: #当遇到的值比基准值小的时候进行互换操作,并且count执行加一操作
temp=list[i]
list[i]=list[start+count]
list[start+count]=temp
count+=1
for i in range(count-1): #将所有元素整体前移一位
list[start+i] = list[start+i+1]
list[start+count-1] = key #将基准值插入到指定位置
return start+count-1 #返回下标
def arr_sort(list,frist,last): #递归循环调用
if last > frist:
pkIndex=quick_sort(list,frist, last) #返回key值得下标
arr_sort(list,frist,pkIndex-1) #分别对前边部分和后半部分进行排序
arr_sort(list,pkIndex+1,last)
def main():
l=[5,3,0,8,9,6,4,2,1,7,8,9,0,6,37,88]
arr_sort(l,0,len(l)-1)
print(l)
if __name__ == "__main__":
print('快速排序:')
main()
运行结果:
python">快速排序:
[0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 8, 9, 9, 37, 88]