相比归并排序来说快速排序在数据量小的情况下是不占优势的,因为快速排序的时间复杂度最好的情况下是n(log n),但是在处理大量数据的时候归并排序就不如时间排序了,因为在空间复杂度上面归并排序消耗资源更多.
所以我们可以做一个判断 如果列表长度小于某个数值的时候走if分支 而大于某个值的时候走else分支.
def QuickSort(array, left=0, right=None):
#获取数组的长度
arrayLen = len(array)
#如果数组的长度小于等于1 则把结束当前递归 返回该数组
if arrayLen <= 1:
return array
#如果右边是None 则说明是刚开始初始化 把数组的总长度减一(总长度的下标) 赋值给右边
if right == None:
right = arrayLen - 1
#如果左边小于右边 说明还没有达到分治的标准 继续递归 否则跳出
if left < right:
#把数组和当前层的左边指针和右边指针传递给函数进行处理
pivot = partition(array, left, right)
#例如 左表[2, 7, 6, 1] 锚点[3] 右表[5, 4, 9]
#把接收到的锚点作为分支的标准 先想作为(左表的)右边界传值
QuickSort(array, left, pivot - 1)
#把接受到的锚点 作为右表的左边界 处理
QuickSort(array, pivot + 1, right)
#处理传递过来的数组
def partition(array, left, right):
#获取数组中最右边的值 作为锚点
pivotValue = array[right]
#得到左边的起始指针 和右边的结束指针
i = left
j = right - 1
#如果起始指针大于结束指针 终止循环
while i < j:
#当右边大于左边指针的位置 并且右边的值大于 锚点值的时候
while j > left and array[j] > pivotValue:
#右边的指针位置向左移动一位
j -= 1
# 当左边小于右边指针的位置 并且左边的值小于等于 锚点值的时候
while i < right and array[i] <= pivotValue:
#左边的指针位置向右移动一位
i += 1
#如果左边指针的位置小于右边
if i < j:
#交换两个数值的位置
array[i], array[j] = array[j], array[i]
#如果左边指针对应的值大于右边指针对应的值
if array[i] > array[right]:
#交换两个数值的位置
array[i], array[right] = array[right], array[i]
return i
if __name__ == '__main__':
testList = [2, 7, 6, 1, 5, 4, 9, 3]
QuickSort(testList)
print(testList)
第二种快速排序写法:
def partition(array, left, right):
i = left - 1
for j in range(left, right):
if array[j] <= array[right]:
i += 1
array[j], array[i] = array[i], array[j]
array[i+1], array[right] = array[right], array[i+1]
return i+1
def QuickSort(array, left=0, right=None):
arrayLen = len(array)
if arrayLen <= 1:
return array
if left < right:
pivot = partition(array, left ,right)
QuickSort(array, left, pivot - 1)
QuickSort(array, pivot + 1, right)