如何利用Python函数快速排序列表
发布时间:2023-05-27 17:28:19
快速排序是一种常用的排序算法。它通过轴点元素将数据划分为两个部分,一部分小于轴点元素,一部分大于轴点元素。然后递归地对这两个部分进行快排,直到部分的长度为 1 或 0。快速排序的时间复杂度为 O(N log N)。
在 Python 中,可以使用递归实现快速排序。下面是一个简单的实现:
def quick_sort(arr):
n = len(arr)
if n <= 1:
return arr
pivot = arr[n // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
这个函数使用中间的元素作为轴点,分别将小于、等于和大于轴点的元素分成三个部分。然后递归地对左右部分进行快排,最后将三个部分拼接起来。
但是,这个函数有一个缺点,在数组长度很大时将会导致栈溢出。因为递归的层数太多,超出了 Python 的默认递归深度。
为了避免栈溢出,可以采用非递归的方式实现快排。具体来说,可以使用堆栈来模拟递归过程,把需要递归的部分压入堆栈中,然后循环执行弹出堆栈的操作。
下面是一个使用堆栈实现快排的函数:
def quick_sort(arr):
if len(arr) <= 1:
return arr
stack = [(0, len(arr) - 1)]
while stack:
left, right = stack.pop()
pivot_index = partition(arr, left, right)
if pivot_index - 1 > left:
stack.append((left, pivot_index - 1))
if pivot_index + 1 < right:
stack.append((pivot_index + 1, right))
return arr
def partition(arr, left, right):
pivot = arr[right]
i = left - 1
for j in range(left, right):
if arr[j] <= pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i + 1], arr[right] = arr[right], arr[i + 1]
return i + 1
这个函数采用了优化过的轴点选取方式:将数组的 个、最后一个和中间一个元素排序后,取中间的元素作为轴点。另外,分区函数也进行了优化,使用两个指针 i 和 j,分别从左往右扫描和从右往左扫描。当找到两个元素分别应该在轴点左边和右边时,就交换它们的位置。
使用堆栈实现快排的函数比递归实现的函数效率更高,因为它避免了递归带来的额外开销。另外,使用堆栈的方式还可以避免栈溢出的问题,能够处理更大的数据量。
