baike 2019-12-09
取待排序数组第一个数作为参照数,建立left和right数组left存储小于参照数的数组集合,right存储大于参照数的数组集合,然后分别对left和right进行递归调用排序。具体算法逻辑如下:
#encoding=utf-8
def quickSort(arr,start,end):
if start>=end:
return arr
low,high = start,end
temp = arr[low]
while low<high:
while low < high and arr[high]>=temp:
high-=1
arr[low] = arr[high]
while low < high and arr[low]<=temp:
low+=1
arr[high] = arr[low]
print("low = %s,high=%s,arr=%s"%(low,high,arr))
arr[low] = temp
quickSort(arr,start,low)
quickSort(arr,low+1,end)
return arr
arr = [3,2,1,5,6,4,3,9]
print(quickSort(arr,0,len(arr)-1))通过循环的从右向左比较和从左向右比较,最终low=high,此时将基准数据放置在low的位置,然后对start---low和low+1---end的数递归调用排序
def PythonQuickSort(arr):
if not arr:
return arr
temp = arr[0]
left = [x for x in arr[1:] if x<=temp]
right = [x for x in arr[1:] if x > temp]
return PythonQuickSort(left)+[temp]+PythonQuickSort(right)
print(PythonQuickSort(arr))PythonQuickSort的代码实现是基于Python的语言特性(列表长度可变来写的代码),主体思路同代码实现01一样
时间复杂度:为O(nlogn)
空间复杂度:快速排序使用递归,递归使用栈,因此它的空间复杂度为O(logn)
稳定性:快速排序无法保证相等的元素的相对位置不变,因此它是不稳定的排序算法