快速排序

成绩 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:\n");
 38     for (j = 0; j<i; j++)
 39         printf("%d ", num[j]);
 40     printf("\n");
 41     printf("Median3 Value:\n");
 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("\n");
 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 }

 

posted @ 2015-12-31 15:07  Daniel_Yi  阅读(1779)  评论(0编辑  收藏  举报