Problem Description
要求根据给定输入,按照课堂给定的快速排序算法进行排序,输出排序结果和median3的返回值。
midian3是指从头尾和中间取3个元素,将头部元素和3个元素中大小的中间值交换,以避免选出最大元素或者最小元素的情况出现。
注:
1.cutoff值为5,元素个数不足cutoff使用插入排序。
2.输入、输出格式参见测试用例0。
测试输入
41
17
34
0
19
#
测试输出
After Sorting:
0 17 19 34 41
Median3 Value:
none
AcCode
//
// main.cpp
// 快速排序
//
// Created by jetviper on 2017/3/26.
// Copyright © 2017年 jetviper. All rights reserved.
//
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#define cutoff 5
int numbers[1000000];
int mdnum=0,mds[1000000];
void insertSort(int arr[],int lhs,int rhs){
for(int i=lhs + 1;i<=rhs;i++){
int temp = arr[i];
int j;
for(j = i - 1;j >= 0 && arr[j] > temp;j--)
{
arr[j+1] = arr[j];
}
if (j != i - 1)arr[j+1] = temp;
}
}
int median3(int arr[], int lhs, int rhs)
{
int mid = (lhs + rhs) / 2;
int tmp[4];
tmp[0] = arr[lhs];
tmp[1] = arr[mid];
tmp[2] = arr[rhs];
for(int i=0;i<3;i++)
for(int j=i+1;j<3;j++)if(tmp[i]>tmp[j]){
int a = tmp[i];
tmp[i]=tmp[j];
tmp[j]=a;
}
arr[lhs] = tmp[0];
arr[mid] = tmp[2];
arr[rhs] = tmp[1];
return tmp[1];
}
int Partition(int arr[], int lhs, int rhs)
{
mds[mdnum++] = median3(arr, lhs, rhs);
int pivot = arr[rhs];
int i,j;
for(i = lhs,j = rhs - 1;;)
{
while (i < j && arr[i] < pivot)i++;
while (i < j && pivot < arr[j])j--;
if (i < j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++,j--;
}
else break;
}
if (arr[i] > pivot)
{
arr[rhs] = arr[i];
arr[i] = pivot;
}
return i;
}
void MainSort(int arr[], int lhs, int rhs)
{
if (rhs - lhs < cutoff)
{
insertSort(arr, lhs, rhs);
}
else
{
int tp = Partition(arr, lhs, rhs);
MainSort(arr, lhs, tp-1);
MainSort(arr, tp+1, rhs);
}
}
int main() {
char temp[100];
int count;
for(int i=0;;i++){
scanf("%s",temp);
if(strcmp(temp,"#")==0){
count = i;
break;
}
numbers[i] = atoi(temp);
}
//start sorting
MainSort(numbers,0,count-1);
printf("After Sorting:\n");
for(int i=0;i<count;i++){
printf("%d ",numbers[i]);
}
printf("\nMedian3 Value:\n");
if(mdnum){
for(int i=0;i<mdnum;i++)printf("%d ",mds[i]);
printf("\n");
}
else {
printf("none\n");
}
return 0;
}