快速排序算法的实现
179 2024-08-14 16:23
快速排序算法
快速排序是一种高效的排序算法,由C. A. R. Hoare在1960年提出。它的基本思想是选择一个元素作为"基准"(pivot),然后将数组分为两部分,一部分包含所有小于基准的元素,另一部分包含所有大于基准的元素。这个过程称为分区(partitioning)。之后,递归地对这两部分继续进行快速排序。
快速排序算法的步骤如下:
1. **选择基准**:从数组中选择一个元素作为基准。不同的选择方法会影响算法的性能。常见的选择方法包括选择第一个元素、最后一个元素、中间元素或随机元素。
2. **分区操作**:重新排列数组,所有比基准小的元素放在基准的左边,所有比基准大的元素放在基准的右边。在这个分区退出之后,该基准就处于数组的中间位置。这个称为分区(partition)操作。
3. **递归排序**:递归地(recursively)将这个过程应用于小于基准的子数组和大于基准的子数组。
4. **结束条件**:当子数组的大小减小到0或1时,排序完成。
快速排序算法的伪代码如下:
```
快速排序(A, 左边界l, 右边界r)
if l < r
p := 分区(A, l, r)
快速排序(A, l, p - 1) // 排序左分区
快速排序(A, p + 1, r) // 排序右分区
分区(A, 左边界l, 右边界r)
pivot := A[r] // 选择最后一个元素作为基准
i := l - 1
for j := l to r - 1
if A[j] <= pivot
i := i + 1
swap(A[i], A[j])
swap(A[i + 1], A[r])
return i + 1
```
快速排序的平均时间复杂度是O(n log n),但在最坏的情况下(例如,数组已经排序或所有元素相等)时间复杂度会退化到O(n^2)。为了避免这种情况,通常使用随机化版本的快速排序,即随机选择基准,以期望达到平均情况的性能。
快速排序是不稳定的排序算法,因为它可能在相同元素之间进行移动。然而,它在实际应用中非常高效,特别是对于大型数据集。
Q:请给出python代码、C++代码
当然,下面是快速排序算法的Python和C++实现。
### Python实现:
```python
def quick_sort(arr):
if len(arr) <= 1:
return arr
else:
pivot = arr[len(arr) // 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)
# 使用示例
arr = [3, 6, 8, 10, 1, 2, 1]
sorted_arr = quick_sort(arr)
print(sorted_arr)
```
### C++实现:
```cpp
#include <iostream>
#include <vector>
int partition(std::vector<int>& arr, int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
std::swap(arr[i], arr[j]);
}
}
std::swap(arr[i + 1], arr[high]);
return (i + 1);
}
void quick_sort(std::vector<int>& arr, int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quick_sort(arr, low, pi - 1);
quick_sort(arr, pi + 1, high);
}
}
int main() {
std::vector<int> arr = {10, 7, 8, 9, 1, 5};
int n = arr.size();
quick_sort(arr, 0, n - 1);
std::cout << "Sorted array: ";
for (int i : arr) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
```
在Python实现中,我们使用了列表推导式来简化代码,而在C++实现中,我们使用了标准库中的`vector`和`swap`函数。两种实现都是递归的,并且在分区函数中使用了相同的逻辑。记得在C++中包含必要的头文件,例如`iostream`用于输入输出操作,`vector`用于动态数组。
全部评论