要求根据给定输入,按照快速排序算法(殷人昆第2版教材 P349 程序8-12)进行排序,输出排序结果和median3的返回值。在划分时,以当前序列的首位元素、中间位置元素和最末元素的中间值为枢轴,记为median3。注意,如median3不在首位,需要和首位元素交换位置。
注:1,cutoff值为5,不足cutoff使用插入排序。
2,输入、输出格式参见测试用例0。
样例
输入(1)
41
17
34
0
19
#
输出(1)
After Sorting:
0 17 19 34 41
Median3 Value:
none
输入(2)
61
59
82
-10
31
-2
-3
10
2
108
12
80
-21
127
12
#
输出(2)
After Sorting:
-21 -10 -3 -2 2 10 12 12 31 59 61 80 82 108 127
Median3 Value:
12 -3 61
代码
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int cutoff = 5;
vector<int> median;
// 插入排序
void insertionSort(vector<int>& arr, int left, int right) {
for (int i = left + 1; i <= right; i++) {
int tmp = arr[i], j = i;
for (; j > left && arr[j - 1] > tmp; j--)
arr[j] = arr[j - 1];
arr[j] = tmp;
}
}
// 计算中位数
void median3(vector<int>& arr, int left, int right) {
int center = (left + right) / 2;
if (arr[left] > arr[center])
swap(arr[left], arr[center]);
if (arr[left] > arr[right])
swap(arr[left], arr[right]);
if (arr[center] > arr[right])
swap(arr[center], arr[right]);
//将中位数放到right-1位置作为枢纽元
swap(arr[center], arr[right - 1]);
}
// 快速排序
void quickSort(vector<int>& arr, int left, int right) {
if (right - left + 1 <= cutoff) {
insertionSort(arr, left, right);
return;
}
median3(arr, left, right);
median.push_back(arr[right - 1]);
int i = left, j = right - 1;
int pivot = arr[right - 1];
for (;;) {
while (arr[++i] < pivot) {}
while (arr[--j] > pivot) {}
if (i < j)
swap(arr[i], arr[j]);
else
break;
}
swap(arr[i], arr[right - 1]);
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
// 主函数处理输入输出
int main() {
int num;
vector<int> nums;
while (cin >> num && cin.peek() != '#') {
nums.push_back(num);
}
quickSort(nums, 0, nums.size() - 1);
cout << "After Sorting:" << endl;
for (const auto& n : nums) {
cout << n << " ";
}
cout << endl;
cout << "Median3 Value:" << endl;
if (nums.size() > 5) {
for (int i = 0; i < median.size(); i++) {
cout << median[i] << " ";
}
}
else cout << "none";
cout << endl;
return 0;
}