C++快速排序实现

60 阅读2分钟

快速排序是一种高效的排序算法,它基于分治策略,通过一趟排序将待排序列分割成独立的两部分,其中一部分的所有元素均比另一部分的元素小,然后分别对这两部分继续进行排序,以达到整个序列有序的目的。

算法步骤

  1. 选择基准元素:从待排序数组中选择一个元素作为 "基准"(pivot)。
  2. 分区操作:重新排列数组,将所有比基准值小的元素放在基准前面,所有比基准值大的元素放在基准后面。
  3. 递归排序:递归地将小于基准值的子数组和大于基准值的子数组进行排序。

代码实现: 通过模板可以使算法对不同的类型进行排序

#include <vector>
#include <functional>
#include <algorithm>

/**
 * 快速排序函数
 * 使用分治策略对数组进行排序
 * @param arr 待排序的数组
 * @param left 排序区间的左边界(包含)
 * @param right 排序区间的右边界(包含)
 */

template<typename T, typename Comp = std::less<T>>
void quick_sort(std::vector<T>& arr, int left, int right, Comp comp = Comp())
{
    // 递归终止条件:当区间只有一个元素或为空时,不需要排序
    if(left >= right) return;
    int i = left, j = right;  //左右指针
    T pivot = arr[left];  //选择基准
    while(i < j)
    {
        while(i < j && comp(arr[j], pivot)) j--;   //从右向左找到第一个小于(大于)基准的元素
        if(i < j) arr[i] = arr[j];                 //将小于(大于)基准的元素赋值给左指针
        while(i < j && comp(pivot, arr[i])) i++;   //从左向右找到第一个大于(小于)基准的元素   
        if(i < j) arr[j] = arr[i];                 //将大于(小于)基准的元素赋值给右指针
    }
    arr[i] = pivot;//将基准赋值给最终位置
    quick_sort(arr, left, i - 1, comp);  //递归排序左子区间
    quick_sort(arr, i + 1, right, comp);  //递归排序右子区间
}

int main()
{
    std::vector<int> arr{2,1,3,5,4,7,6};
    quick_sort(arr, 0, static_cast<int>(arr.size() - 1));
    for(int i : arr)
    {
        std::cout << i << " ";
    }
    std::cout << std::endl;
    std::vector<std::string> str{"hello", "world", "cpp", "algorithm"};
    quick_sort(str, 0, static_cast<int>(str.size() - 1), std::greater<std::string>());
    for(std::string s : str)
    {
        std::cout << s << " ";
    }
    std::cout << std::endl;
    return 0;
}