在快速排序中,最坏情况出现在待排序数组已经按照有序的方式排列。这种情况下,快速排序的时间复杂度为O(n^2)。
为了改进快速排序的最坏情况复杂度,可以采用以下方法:
代码示例:
import random
def quicksort(arr, low, high):
if low < high:
# 随机选择枢轴元素
pivot_index = random.randint(low, high)
arr[low], arr[pivot_index] = arr[pivot_index], arr[low]
# 划分操作
pivot = partition(arr, low, high)
# 递归调用快速排序
quicksort(arr, low, pivot - 1)
quicksort(arr, pivot + 1, high)
def partition(arr, low, high):
pivot = arr[low]
i = low + 1
j = high
while True:
while i <= j and arr[i] <= pivot:
i += 1
while arr[j] >= pivot and j >= i:
j -= 1
if j <= i:
break
arr[i], arr[j] = arr[j], arr[i]
arr[low], arr[j] = arr[j], arr[low]
return j
代码示例:
def quicksort(arr, low, high):
if low < high:
# 三数取中法选择枢轴元素
mid = (low + high) // 2
if arr[low] > arr[mid]:
arr[low], arr[mid] = arr[mid], arr[low]
if arr[low] > arr[high]:
arr[low], arr[high] = arr[high], arr[low]
if arr[mid] > arr[high]:
arr[mid], arr[high] = arr[high], arr[mid]
arr[low], arr[mid] = arr[mid], arr[low]
# 划分操作
pivot = partition(arr, low, high)
# 递归调用快速排序
quicksort(arr, low, pivot - 1)
quicksort(arr, pivot + 1, high)
def partition(arr, low, high):
pivot = arr[low]
i = low + 1
j = high
while True:
while i <= j and arr[i] <= pivot:
i += 1
while arr[j] >= pivot and j >= i:
j -= 1
if j <= i:
break
arr[i], arr[j] = arr[j], arr[i]
arr[low], arr[j] = arr[j], arr[low]
return j
以上两种方法都可以改进快速排序的最坏情况复杂度,使其更加高效。