要求根据给定输入,按照课堂给定的快速排序算法进行排序,输出排序结果和median3的返回值。
注:1,cutoff值为5,不足cutoff使用插入排序。
2,输入、输出格式参见测试用例0。
测试输入
41 17 34 0 19 #
测试输入
After Sorting: 0 17 19 34 41 Median3 Value: none
源代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include <iostream>
using namespace std;
#define EQ(a,b) ((a) == (b))
#define LT(a,b) ((a) < (b))
#define LQ(a,b) ((a) <= (b))
#define MAXSIZE 1000
int a[MAXSIZE],y=0;
void Median3(int map[], int p, int q ) //取前中后三个元素,然后最小的放在最前,最大的放在最后,中值放在最大的左边。
{
int c = ( p + q ) / 2;
if( map[p] > map[c] ){
swap<int>(map[p], map[c]);
}
if( map[p] > map[q] ){
swap<int>(map[p], map[q]);
}
if( map[c] > map[q] ){
swap<int>(map[c], map[q]);
}
swap<int>(map[c],map[q-1]);
a[y++]=map[q-1];
}
void Insort(int num[],int i,int j){ // 一趟划分,采用三者取中值作主元
int k;
for(i=2;i<=j;i++){
num[0]=num[i];
k=i-1;
while(num[0]<num[k]){ //从零开始,则应防止数组下标越界,(不用0时,则必定不会越界,在0时,跳出)
num[k+1]=num[k];
k=k-1;
}
num[k+1]=num[0];
}
}
void QKsort(int num[],int low,int high)
{
int i,j,temp;
Median3(num,low,high);
i=low; //一定要从low开始,low+1的话与中值交换的下标不对。
j=high-1;
int x = num[j];
while(1){
while(num[++i]<x){ }
while(num[--j]>x){ }
if(i<j){
temp=num[i];
num[i]=num[j];
num[j]=temp;
}
else break;
}
num[high-1]=num[i]; //将中值放在中间。
num[i]=x;
if(low+5<=i)
QKsort(num,low,i-1);
else
Insort(num,low,i-1);
if(i+5<=high)
QKsort(num,i+1,high);
else
Insort(num,i+1,high);
}
int main(){
int num[MAXSIZE];
int i=1,j=1,k=0;
while((scanf("%d",&num[i])==1)){
getchar();
i++;
}
if(i>6)
QKsort(num,1,i-1);
else
Insort(num,1,i-1);
printf("After Sorting:\n");
while(j<i) {
printf("%d ",num[j]);
j++;
}
printf("\n");
printf("Median3 Value:\n");
if(y>0) {
while(k<y)
printf("%d ",a[k++]);
printf("\n");
}
else printf("none\n");
}