如何实现快速排序算法以从大到小的顺序对数组进行排序?C++
时间: 2024-10-21 08:04:14 浏览: 19
c++实现对输入数组进行快速排序的示例(推荐)
5星 · 资源好评率100%
快速排序是一种高效的排序算法,通常用于从小到大的顺序排列元素。但是,如果你想按照从大到小的顺序对数组进行排序,你可以稍微修改快速排序的基本思想,使其在比较元素时反转条件。以下是基本步骤:
1. **选择基准**:像正常快速排序一样,选择一个基准值。这里我们通常选最后一个元素作为基准。
2. **划分**:从左往右扫描数组,当遇到比基准更大的元素,就交换它们的位置。这一步骤会使得基准右侧的所有元素都大于它,而左侧的元素则小于等于它。
3. **递归处理**:对于基准左边的子数组和右边的子数组,继续使用相同的快速排序策略,直到所有子数组只剩下一个元素或为空。
4. **逆序终止条件**:在递归过程中,当子数组只剩下一个元素或为空时,停止递归,因为已经达到了自然排序的大到小的目的。
下面是C++中的代码示例,注意这里的`greater<T>()`是比较操作符的逆序版本:
```cpp
#include <algorithm>
#include <vector>
template<typename T>
void quickSortDescending(std::vector<T>& arr, size_t low = 0, size_t high = std::numeric_limits<size_t>::max()) {
if (low < high) {
size_t pivotIndex = partition(arr, low, high, greater<T>());
quickSortDescending(arr, low, pivotIndex - 1);
quickSortDescending(arr, pivotIndex + 1, high);
}
}
// 分区函数,返回基准的正确位置
size_t partition(std::vector<T>& arr, size_t low, size_t high, const std::function<bool(T, T)>& comp) {
T pivot = arr[high];
while (low <= high) {
while (low <= high && !comp(arr[low], pivot)) ++low; // 找到第一个大于等于pivot的元素
while (low <= high && comp(pivot, arr[high])) --high; // 找到第一个小于pivot的元素
if (low <= high) { // 交换两个元素
std::swap(arr[low], arr[high]);
++low;
--high;
}
}
return low;
}
```
阅读全文