1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
| #include<stdio.h>
static int N = 10; int i = 0, j = 0;
void print(int a[]) { for (int i = 0; i < N; i++) { printf("%d ", a[i]); } printf("\n"); }
/////////////////////////////// // 把第i个元素插入到前面合适的位置(其它元素顺应后移) ////////////////////////////// void insert_sort(int a[]) { int tmp, i, j; for (i = 1; i < N; i++) { tmp = a[i]; for (j = i; j > 0 && tmp < a[j - 1]; j--) { a[j] = a[j - 1]; } a[j] = tmp; } }
/////////////////////////////// //因为插入排序对已经近似排序好的序列时间复杂度低 //分组,执行log(n)次插入排序 /////////////////////////////// void shell_sort(int a[]) { int gap, i, j, tmp;
for (gap = N / 2; gap > 0; gap /= 2) { for (i = gap; i < N; i++) { tmp = a[i]; for (j = i; j >= gap; j -= gap) { if (a[j - gap] > tmp) { //if不能跟前面的插入排序一样跟for写在一行,否则就失去希尔排序的意义了 a[j] = a[j - gap]; } else { break; } } a[j] = tmp; } } }
//////////////////////////////// //堆排序:1.构建堆(下滤);2.不断的首尾交换&下滤 // /////////////////////////////// void perc_down(int a[], int i, int N) { int tmp = a[i]; int child; while (i < (N - 1) / 2) { //leftchild<N ==> 2*i+1<N ==> i<N-1 child = 2 * i + 1; if (a[child] > a[child + 1]) { child++; } if (tmp > a[child]) { a[i] = a[child]; i = child; } else { break; } } a[i] = tmp; }
void heap_sort(int a[]) { int tmp; for (int i = N / 2; i >= 0; i--) { perc_down(a, i, N); }
for (int i = N - 1; i > 0; i--) { tmp = a[0]; a[0] = a[i]; a[i] = tmp; perc_down(a, 0, i); printf("%d:\t", i); print(a); }
}
//////////////////////////////// //两个有序数组合并成一个有序数组 ////////////////////////////////
void merge(int a[], int tmp_array[], int l, int r, int r_end) { int num = r_end - l + 1; int tmp_position = l; int l_end = r - 1;
while (l <= l_end && r <= r_end) { if (a[l] < a[r]) { tmp_array[tmp_position++] = a[l++]; } else { tmp_array[tmp_position++] = a[r++]; } } while (l <= l_end) { tmp_array[tmp_position++] = a[l++]; } while (r <= r_end) { tmp_array[tmp_position++] = a[r++]; } for (i = 0; i < num; i++, r_end--) { a[r_end] = tmp_array[r_end]; }
}
void msort(int a[], int tmp_array[], int l, int r) { int center; if (l < r) { center = (l + r) / 2;//c-l<=r-c msort(a, tmp_array, l, center); msort(a, tmp_array, center + 1, r); merge(a, tmp_array, l, center + 1, r); } }
void merge_sort(int a[]) { int tmp_array[N]; msort(a, tmp_array, 0, N - 1); }
///////////////////////// //高中的时候能一分钟敲完的算法 /////////////////////////
void qsort(int a[], int left, int right) { int i, j, t, tmp; if (left > right) return;
tmp = a[left]; i = left; j = right; while (i != j) { while (a[j] >= tmp && i < j) j--; while (a[i] <= tmp && i < j) i++; if (i < j) { t = a[i]; a[i] = a[j]; a[j] = t; } }//左边大的跟右边小的交换,使得左边的小于tmp,右边的大于tmp a[left] = a[i]; a[i] = tmp; //tmp放在中间
qsort(a, left, i - 1); qsort(a, i + 1, right); }
void quick_sort(int a[]) { qsort(a, 0, 9); }
int main() { // int a[10] = {4, 85, 3, 234, 45, 346, 345, 122, 30, 12}; // insert_sort(a); // printf("insert_sort: "); // print(a);
// int a[10] = {4, 85, 3, 234, 45, 346, 345, 122, 30, 12}; // shell_sort(a); // printf("shell_sort: "); // print(a);
// // int a[10] = {4, 85, 3, 234, 45, 346, 345, 122, 30, 12}; // heap_sort(a); // printf("heap_sort: "); // print(a);
// int a[10] = {4, 85, 3, 234, 45, 346, 345, 122, 30, 12}; // merge_sort(a); // printf("merge_sort: "); // print(a);
int a[10] = {4, 85, 3, 234, 45, 346, 345, 122, 30, 12}; quick_sort(a); printf("quick_sort: "); print(a);
return 0; }
|