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)
稳定性:快速排序无法保证相等的元素的相对位置不变,因此它是不稳定的排序算法