快速排序算法的实现

119 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`用于动态数组。

 

全部评论

·