快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的核心思想是分治策略,通过一趟排序将待排序的数据分成两个部分,一部分的所有元素都比另一部分的所有元素小,然后对这两部分再分别进行快速排序,递归进行这个过程,直到整个序列有序。
在Python中实现快速排序,首先我们需要一个partition函数来执行“分”的操作。partition函数选取一个基准值(pivot),通常选择序列的第一个元素,然后将序列分为两部分:一部分的元素都小于基准值,另一部分的元素都大于或等于基准值。这个过程通过两个指针low和high完成,low从左侧开始,high从右侧开始。当low找到一个大于基准的元素时,high找到一个小于或等于基准的元素时,两个元素互换位置。将基准值放在low和high相遇的位置,此时基准左边的元素都小于它,右边的元素都大于或等于它。
以下是Python实现的partition函数:
```python
def partition(v, left, right):
key = v[left]
low = left
high = right
while low < high:
while (low < high) and (v[high] >= key):
high -= 1
v[low] = v[high]
while (low < high) and (v[low] <= key):
low += 1
v[high] = v[low]
v[low] = key
return low
```
接下来是quicksort函数,它接收一个序列v,以及左右边界left和right。如果left小于right,说明序列还有未排序的部分,我们调用partition函数得到基准值的新位置p,然后分别对基准值左侧和右侧的子序列递归调用quicksort函数。
```python
def quicksort(v, left, right):
if left < right:
p = partition(v, left, right)
quicksort(v, left, p-1)
quicksort(v, p+1, right)
return v
```
我们可以创建一个待排序的序列,并调用quicksort函数进行排序:
```python
s = [6, 8, 1, 4, 3, 9, 5, 4, 11, 2, 2, 15, 6]
print("before sort:", s)
sorted_s = quicksort(s, 0, len(s) - 1)
print("after sort:", sorted_s)
```
这段代码将会输出:
```
before sort: [6, 8, 1, 4, 3, 9, 5, 4, 11, 2, 2, 15, 6]
after sort: [1, 2, 2, 3, 4, 4, 5, 6, 6, 8, 9, 11, 15]
```
快速排序的平均时间复杂度是O(n log n),最坏情况下是O(n^2),但这种情况很少发生。在实际应用中,快速排序的性能通常优于其他O(n log n)的排序算法,因为它的常数因子较小,而且在处理大量数据时,其内部循环可以被高度优化。然而,对于小规模或者几乎已排序的输入,插入排序或其他简单排序可能更高效。此外,快速排序不是稳定的排序算法,即相等的元素可能会改变它们的相对顺序。