快速排序是一种高效的排序算法,它基于分治策略,通过一趟排序将待排序列分割成独立的两部分,其中一部分的所有元素均比另一部分的元素小,然后分别对这两部分继续进行排序,以达到整个序列有序的目的。
算法步骤
- 选择基准元素:从待排序数组中选择一个元素作为 "基准"(pivot)。
- 分区操作:重新排列数组,将所有比基准值小的元素放在基准前面,所有比基准值大的元素放在基准后面。
- 递归排序:递归地将小于基准值的子数组和大于基准值的子数组进行排序。
代码实现: 通过模板可以使算法对不同的类型进行排序
#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;
}