• 快速排序


    成绩 10 开启时间 2015年12月9日 星期三 10:00
    折扣 0.8 折扣时间 2015年12月22日 星期二 23:55
    允许迟交 关闭时间 2015年12月31日 星期四 23:55

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

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

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

      1 #include"stdio.h"            
      2 #include"stdlib.h"
      3 #include"string.h"
      4 int num[10000];
      5 int median3[100], counter = 0;
      6 char N[100];
      7 
      8 int change();
      9 void Qsort(int left, int right);
     10 int partition(int left, int right);
     11 int find(int left, int right);
     12 void swap(int *a, int *b)
     13 {
     14     int temp;
     15     temp = *a;
     16     *a = *b;
     17     *b = temp;
     18 }
     19 void insertsort(int left, int right);
     20 
     21 int main()
     22 {
     23     int n, i = 0, j;
     24     while (1)
     25     {
     26         scanf("%s", &N);
     27         getchar();
     28         if (N[0] != '#')
     29         {
     30             n = change();
     31             num[i++] = n;
     32         }
     33         else
     34             break;
     35     }
     36     Qsort(0, i - 1);
     37     printf("After Sorting:
    ");
     38     for (j = 0; j<i; j++)
     39         printf("%d ", num[j]);
     40     printf("
    ");
     41     printf("Median3 Value:
    ");
     42     if (i>5)
     43     {
     44         for (j = 0; j<counter; j++)
     45             printf("%d ", median3[j]);
     46     }
     47     else
     48         printf("none");
     49     printf("
    ");
     50     system("pause");
     51     return 0;
     52 }
     53 
     54 int change()
     55 {
     56     int x = 0, L, i, flag = 0;
     57     L = strlen(N);
     58     if (N[0] == '-')
     59     {
     60         flag = 1;
     61     }
     62     for (i = flag; i<L; i++)
     63     {
     64         x *= 10;
     65         x += N[i] - 48;
     66     }
     67     if (flag)
     68         return -x;
     69     else
     70         return x;
     71 }
     72 
     73 void Qsort(int left, int right)
     74 {
     75     int middle;
     76     if (left<right)
     77     {
     78         middle = partition(left, right);
     79         if (middle != -1)
     80         {
     81             Qsort(left, middle - 1);
     82             Qsort(middle + 1, right);
     83         }
     84     }
     85 }
     86 
     87 int partition(int left, int right)
     88 {
     89     int key, temp;
     90     int i, j;
     91     if (right - left<5)
     92     {
     93         insertsort(left, right);
     94         return -1;
     95     }
     96     else
     97     {
     98         key = find(left, right);
     99         i = left;
    100         j = right - 1;
    101         while (i<j)
    102         {
    103             while (i<j&&num[++i]<key);
    104             while (i<j&&num[--j]>key);
    105             swap(&num[i], &num[j]);
    106         }
    107         swap(&num[i], &num[right - 1]);
    108         return i;
    109     }
    110 }
    111 
    112 int find(int left, int right)
    113 {
    114     int mid = (left + right) / 2;
    115     if (num[left]>num[mid])
    116         swap(&num[left], &num[mid]);
    117     if (num[left]>num[right])
    118         swap(&num[left], &num[right]);
    119     if (num[mid]>num[right])
    120         swap(&num[mid], &num[right]);
    121     swap(&num[mid], &num[right - 1]);
    122     median3[counter++] = num[right - 1];
    123     return num[right - 1];
    124 }
    125 
    126 void insertsort(int left, int right)
    127 {
    128     int i, j, k, temp;
    129     for (i = left + 1; i <= right; i++)
    130     {
    131         if (num[i] - num[i - 1]<0)
    132         {
    133             temp = num[i];
    134             for (j = left; num[j]<num[i]; j++);
    135             for (k = i; k >= j + 1; k--)
    136             {
    137                 num[k] = num[k - 1];
    138             }
    139             num[j] = temp;
    140         }
    141     }
    142 }
  • 相关阅读:
    SQL注入: with rollup特性
    【转】kali配置--修改IP和DNS
    【转】getopt模块,实现获取命令行参数
    socket编程: TypeError: must be bytes or buffer, not str
    Ansible进阶之企业级应用
    Ansible之Playbook详解
    Ansible之常用模块介绍
    JAVA企业级应用Tomcat实战
    ubuntu网络、包管理、工作内容小结
    shell细节决定高度
  • 原文地址:https://www.cnblogs.com/yixianyong/p/5091787.html
Copyright © 2020-2023  润新知