快速排序:又称划分交换排序,在数列中找到一个基准,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,依次类推,完成所有数据的排序。
最优的时间复杂度:O(nlogn)
最坏的时间复杂度:O(n²)
是不稳定排序
"""
快速排序:在数列中找到一个基准,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一
部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,依次类推,完成所有数据的排序。
"""
def quickSort(start,end,dataList):
"""
:param start: 序列中排序的开始位置
:param end: 序列中排序的结束位置
:param dataList: 默认将序列按照升序排序
:return:
"""
#递归出口。当start=end说明子序列只有一个元素,已经放在了正确的位置上,无需排序。
if start>=end:
return
# 默认取序列第一个元素为基准
flag = dataList[start]
#序列中由左向右移动的游标
low=start
#序列中由右向左移动的游标
high = end
#按照升序排列,所以将比flag大的元素移动到右边,比flag小的元素移动到左边。
#一定要考虑和flag相等的元素,否则会出现死循环。
while low<high:
#先从右开始往左找,如果值比flag大,继续往左,end-1。
#碰到比flag小的元素,则将该数据移动到data[low]的位置上去
while low<high:
if dataList[high] > flag:
high-=1
else:
#相等的时候,也会将数据移动到flag的左边,所以快速排序也不是稳定排序。
dataList[low]=dataList[high]
low+=1
#跳出内层循环之后,将开始从左往右找
break
#从左开始往右找
while low<high:
if dataList[low]<=flag:
low+=1
else:
dataList[high] = dataList[low]
high-=1
break
#跳出上面的while循环,说明此时low=flag,可以确定flag在序列中的下标。
dataList[low]=flag
quickSort(start,low-1,dataList)
quickSort(low+1,end,dataList)
dataList = [12,32,1,43,54,23,32,12,99,2]
quickSort(0,9,dataList)
print(dataList)