要求根据给定输入,按照课堂给定的快速排序算法进行排序,输出排序结果和median3的返回值。
注:1,cutoff值为5,不足cutoff使用插入排序。
2,输入、输出格式参见测试用例0。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
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 quickSort(vector<int> &arr, int left, int right, vector<int> &median)
{
if (right - left + 1 <= 5)
{
insertionSort(arr, left, right);
return;
}
auto median3 = [&](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]);
swap(arr[center], arr[right - 1]);
};
median3(left, right);
median.emplace_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, median);
quickSort(arr, i + 1, right, median);
}
int main()
{
vector<int> v;
int n;
while (cin >> n && cin.peek() != '#')
v.emplace_back(n);
int len = v.size();
vector<int> median;
quickSort(v, 0, len - 1, median);
cout << "After Sorting:" << endl;
for (int num : v)
cout << num << " ";
cout << endl;
cout << "Median3 Value:" << endl;
if (!median.empty())
{
for (int num : median)
cout << num << " ";
cout << endl;
}
else
cout << "none" << endl;
return 0;
}