要求根据给定输入,按照课堂给定的快速排序算法进行排序。在划分时,以当前序列的首位元素、中间位置元素和最末元素的中间值为枢轴,记为median3。注意,如median3不在首尾,需要和首位元素交换位置。
要求输出排序结果和median3的返回值。
注:1,cutoff值为5,不足cutoff使用插入排序。
2,输入、输出格式参见测试用例0。
测试输入![]() | 期待的输出![]() | 时间限制![]() | 内存限制![]() | 额外进程![]() | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int sz[100],median[100],mnum;
int Median3(int lt, int rt) //三平均划分法
{
int Middle = (lt + rt) / 2;
if (sz[lt] > sz[Middle])
swap(sz[lt], sz[Middle]);
if (sz[lt] > sz[rt])
swap(sz[lt], sz[rt]);
if (sz[Middle] > sz[rt])
swap(sz[Middle], sz[rt]);
swap(sz[Middle], sz[rt - 1]);
median[mnum] = sz[rt - 1];
++mnum;
return sz[rt - 1];
}
void InsertSort(int lt, int rt)
{
for (int i = lt + 1; i <= rt; i++)
{
int temp = sz[i];
if (sz[i] < sz[i-1])
{
int j = lt;
for (; sz[j] < temp; j++); //找到插入点
for (int k = i; k > j ; k--) sz[k] = sz[k-1]; //后移
sz[j] = temp;
}
}
return;
}
void QuickSort(int lt, int rt)
{
if(rt-lt<5)
{
InsertSort(lt, rt);
return;
}
else if (lt < rt)
{
int pivot = Median3(lt, rt);
int L = lt,R = rt - 1; //从左到右的扫描从第一个元素开始,从右到左的扫描从倒数第二个元素开始
while (L < R)
{
while (L < R&&sz[++L] < pivot);
while (L < R&&sz[--R] > pivot);
swap(sz[L], sz[R]);
}
swap(sz[L], sz[rt - 1]);
int Middle = L; // 中轴
if (Middle != -1)
{
QuickSort(lt, Middle - 1);
QuickSort(Middle + 1, rt);
}
}
}
int main()
{
string s1;
int length;
while(1)
{
cin>>s1;
if(s1[0]=='#') break;
sz[length]=atoi(s1.c_str());
++length;
}
QuickSort(0,length-1);
cout<<"After Sorting:"<<endl;
for(int i=0; i<length ; ++i)
{
cout<<sz[i]<<" ";
}
cout<<endl;
cout<<"Median3 Value:"<<endl;
if(length>5)
{
for(int i ;i<mnum;++i) cout<<median[i]<<" ";
}
else cout<<"none";
cout<<endl;
}