c++代码实现轴点“三者取中”法的快速排序算法,并统计各个序列上所需的排序码比较次数
时间: 2023-06-25 10:07:22 浏览: 65
快速排序完整代码
以下是使用轴点“三者取中”法的快速排序算法的 C++ 实现,同时统计了每个序列上所需的排序码比较次数。
```c++
#include <iostream>
#include <vector>
using namespace std;
// 交换 a 和 b 的值
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
// 获取轴点位置
int partition(vector<int>& nums, int left, int right, int& cnt) {
int mid = left + (right - left) / 2;
// 三者取中,将中间值作为轴点
if (nums[left] > nums[right])
swap(nums[left], nums[right]);
if (nums[mid] > nums[right])
swap(nums[mid], nums[right]);
if (nums[mid] > nums[left])
swap(nums[mid], nums[left]);
int pivot = nums[left];
while (left < right) {
while (left < right && nums[right] >= pivot) {
right--;
cnt++;
}
nums[left] = nums[right];
while (left < right && nums[left] <= pivot) {
left++;
cnt++;
}
nums[right] = nums[left];
}
nums[left] = pivot;
return left;
}
// 快速排序
void quickSort(vector<int>& nums, int left, int right, int& cnt) {
if (left < right) {
int pivotIndex = partition(nums, left, right, cnt);
quickSort(nums, left, pivotIndex - 1, cnt);
quickSort(nums, pivotIndex + 1, right, cnt);
}
}
int main() {
vector<int> nums = {7, 6, 5, 4, 3, 2, 1};
int cnt = 0;
quickSort(nums, 0, nums.size() - 1, cnt);
cout << "比较次数: " << cnt << endl;
for (int num : nums) {
cout << num << " ";
}
cout << endl;
return 0;
}
```
以上代码中的 `partition` 函数使用轴点“三者取中”法来确定轴点位置,同时统计了每个序列上所需的排序码比较次数。在 `quickSort` 函数中,通过调用 `partition` 函数来确定轴点位置,并对左右两个子序列进行递归排序。
在 `main` 函数中,我们初始化一个待排序序列 `nums`,并调用 `quickSort` 函数进行排序。最后输出排序后的序列和排序码比较次数。
注意,以上实现中的排序码比较次数,只包括对序列中的元素进行比较的次数,不包括交换元素值的次数。
阅读全文