1. 快速排序

成绩10开启时间2018年11月25日 星期日 18:00
折扣0.8折扣时间2018年12月15日 星期六 23:55
允许迟交关闭时间2018年12月25日 星期二 23:55

要求根据给定输入,按照课堂给定的快速排序算法进行排序,输出排序结果和median3的返回值。

 注:1,cutoff值为5,不足cutoff使用插入排序。

        2,输入、输出格式参见测试用例0。

 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助
测试用例 1以文本方式显示
  1. 41↵
  2. 17↵
  3. 34↵
  4. 0↵
  5. 19↵
  6. #↵
以文本方式显示
  1. After Sorting:↵
  2. 0 17 19 34 41 ↵
  3. Median3 Value:↵
  4. none↵
1秒64M0
测试用例 2以文本方式显示
  1. 61↵
  2. 59↵
  3. 82↵
  4. -10↵
  5. 31↵
  6. -2↵
  7. -3↵
  8. 10↵
  9. 2↵
  10. 108↵
  11. 12↵
  12. 80↵
  13. -21↵
  14. 127↵
  15. 12↵
  16. #↵
以文本方式显示
  1. After Sorting:↵
  2. -21 -10 -3 -2 2 10 12 12 31 59 61 80 82 108 127 ↵
  3. Median3 Value:↵
  4. 12 -3 61 ↵
1秒64M0

 

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int cutoff = 5;
int numbers[1000], mid=0, midnumbers[100];

void InsertSort(int num[],int left,int right){
    int temp, j;
    for(int i=left + 1; i<=right; i++){
        temp = num[i];
        for(j = i - 1;j >= 0 && num[j] > temp;j--)
        {
            num[j+1] = num[j];
        }
        if (j != i - 1)
            num[j+1] = temp;
    }
}

int  MidCheck(int numbers[], int left, int right)
{
    int mid = (left + right) / 2;
    int temp[3];
    temp[2] = numbers[right];
    temp[1] = numbers[mid];
    temp[0] = numbers[left];
    for(int i=0;i<3;i++)
        for(int j=i+1;j<3;j++)
            if(temp[i]>temp[j]){
                int a = temp[i];
                temp[i]=temp[j];
                temp[j]=a;
            }
    numbers[left] = temp[0];
    numbers[right] = temp[1];
    numbers[mid] = temp[2];
    
    return temp[1];
}

void Sort(int numbers[], int left, int right)
{
    if (right - left < cutoff)
    {
        InsertSort(numbers, left, right);
    }
    else
    {
        midnumbers[mid++] = MidCheck(numbers, left, right);
    
        int pivot = numbers[right];
        int i = left ,j = right-1;
        while(1)
        {
            while (i < j && numbers[i] < pivot)i++;
            while (i < j && pivot < numbers[j])j--;
            if (i < j)
            {
                int c = numbers[i];
                numbers[i] = numbers[j];
                numbers[j] = c;
                i++,j--;
            }
            else break;
        }
        if (numbers[i] >= pivot)
        {
            numbers[right] = numbers[i];
            numbers[i] = pivot;
        }
        Sort(numbers, left, i-1);
        Sort(numbers, i+1, right);
    }
}
int main() {
    int count = 0;
    char x[20];
    while(1){
        scanf("%s",x);
        if(strcmp(x,"#")==0)
            break;
        numbers[count++] = atoi(x);
    }

    Sort(numbers,0,count-1);
    
    printf("After Sorting:\n");
    for(int i=0;i<count;i++){
        printf("%d ",numbers[i]);
    }
    printf("\nMedian3 Value:\n");
    if(mid > 0){
        for(int i=0;i<mid;i++)
            printf("%d ",midnumbers[i]);
        printf("\n");
    }
    else {
        printf("none\n");
    }
    return 1;
}

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值