快速排序算法(C++版)

1、什么是快速排序

快速排序(Quick Sort)是一种常用的高效排序算法,属于分治法的典型代表。它的基本思想是选择一个基准元素,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有元素小于基准,另一部分的所有元素大于基准,然后对这两部分分别递归地进行排序。因为排序是在原有数据上进行的,所以属于"原地排序"。

2、快速排序的基本步骤:

  1. 选择基准元素:从数组中选择一个元素作为基准,通常选择最后一个元素。

  2. 划分阶段:重新排列数组,将小于基准的元素放在基准的左侧,大于基准的元素放在基准的右侧。基准元素的最终位置称为分区点。

  3. 递归排序:对划分得到的两个子数组分别递归地进行快速排序。

  4. 合并阶段:不需要合并步骤,因为排序是原地进行的。

3、快速排序的适用范围和特点:

适用范围

  • 快速排序适用于大规模数据集的排序,尤其是对于数组或列表等数据结构的排序。
  • 由于其平均时间复杂度为O(n log n),在大多数情况下,它比其他O(n log n)的排序算法更快。

特点

  1. 高效性:在平均情况下,快速排序的性能非常好,其平均时间复杂度为O(n log n)。这比许多其他排序算法都要快。

  2. 原地排序:快速排序是一种原地排序算法,不需要额外的内存空间。

  3. 不稳定性:在排序的过程中,元素的相对位置可能会发生改变,所以快速排序是一种不稳定的排序算法。

  4. 适应性:快速排序在处理部分有序的数据时性能也很好,而且在实际应用中,大多数数据都是部分有序的。

  5. 递归实现:算法使用递归来分治和解决问题,这使得实现相对简单,但也可能导致在数据规模较大时的堆栈溢出问题。

尽管快速排序有上述优点,但在最坏情况下,即基准元素的选择不当时,时间复杂度可能达到O(n^2),这是其主要缺点之一。在实际应用中,通常通过优化基准元素的选择、随机化等方法来降低最坏情况的出现概率。

4、C++版的快速排序示例

#include 
#include 

// 交换数组中两个元素的位置
void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

// 在数组中选择一个基准元素,并将数组划分成两个部分,左边小于基准,右边大于基准
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;
            swap(arr[i], arr[j]);
        }
    }

    swap(arr[i + 1], arr[high]);
    return i + 1;
}

// 快速排序递归函数
void quickSort(std::vector<int> &arr, int low, int high) {
    if (low < high) {
        int pivotIndex = partition(arr, low, high); // 获取基准元素的正确位置

        // 对基准元素左右两侧分别进行递归排序
        quickSort(arr, low, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, high);
    }
}

// 打印数组元素
void printArray(const std::vector<int> &arr) {
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
}

int main() {
    std::vector<int> arr = {64, 34, 25, 12, 22, 11, 90};
    int n = arr.size();

    std::cout << "Unsorted array: ";
    printArray(arr);

    quickSort(arr, 0, n - 1);

    std::cout << "Sorted array: ";
    printArray(arr);

    return 0;
}

这个程序中,quickSort 函数是递归进行快速排序的主要函数,而 partition 函数用于在数组中选择基准元素并划分数组。最后,通过 swap 函数来交换数组中两个元素的位置。

你可能感兴趣的:(C,排序算法,c++,算法)