快速排序
成绩 | 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 }