基于分治法,编写一个快速排序函数,并比较迭代或递归排序法的计算效率。解法:分治法也利用了递归的概念,先将序列均分成两组,然后调用程序自己,分别将两组数据排序,再逐个比较排好序的两组数据的第1个数,形成最终的排序数据
时间: 2024-12-13 15:26:12 浏览: 7
基于分治法的快速排序是一种经典的排序算法。它的基本思路是选择一个基准值(pivot),将数组分为两个部分,一部分包含所有小于基准值的元素,另一部分包含所有大于基准值的元素。这个过程通过递归进行:
```python
def quick_sort(arr):
if len(arr) <= 1: # 当数组只有一个元素或为空时,直接返回
return arr
pivot = arr[len(arr) // 2] # 选取中间值作为基准
less = [x for x in arr if x < pivot] # 小于基准的元素
equal = [x for x in arr if x == pivot] # 等于基准的元素
greater = [x for x in arr if x > pivot] # 大于基准的元素
return quick_sort(less) + equal + quick_sort(greater) # 递归地对左右两部分进行排序并合并
# 迭代版本(Python中一般较少见,但在其他语言如C++中较为常见)
def iterative_quick_sort(arr, low, high):
stack = [(low, high)]
while stack:
left, right = stack.pop()
if left < right:
pivot_index = partition(arr, left, right)
stack.append((left, pivot_index - 1))
stack.append((pivot_index + 1, right))
def partition(arr, low, high):
pivot = arr[high]
i = low - 1
for j in range(low, high):
if arr[j] <= pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i+1], arr[high] = arr[high], arr[i+1]
return i + 1
```
关于计算效率,通常来说,递归实现的快速排序在平均情况下的时间复杂度为O(n log n),因为它能够很好地平衡划分。然而,最坏情况下(数组已排序或完全逆序),递归深度会达到n,导致时间复杂度退化到O(n^2)。而迭代版本避免了这个问题,因为它是采用栈的方式控制递归,所以性能更稳定。
阅读全文