各种排序
各种排序实现,无聊写出来,留个念像。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define SORT_ARRAY_SIZE 40 5 #define SWAP(a, b, temp) (temp) = (a); (a) = (b); (b) = (temp); 6 7 void heapSort(int *array, int size); 8 void adjustHeap(int *array, int root, int size); 9 void quickSort(int *array, int begin, int end); 10 void mergeSort(int *array, int begin, int end); 11 void merge(int *array, int begin, int end); 12 void insertSort( int *array, int size ); 13 void swapSort( int *array, int size ); 14 void pickSort(int *array, int size); 15 void mkRandomArray(int *array, int size); 16 void printArray(int *array, int size); 17 void printArrayOneLine(int *array, int begin, int end); 18 int verifySort(int *old, int *sorted, int size); 19 20 int main() 21 { 22 int *array, *arrayVerify; 23 24 array = (int *)calloc(SORT_ARRAY_SIZE, sizeof(int)); 25 arrayVerify = (int *)calloc(SORT_ARRAY_SIZE, sizeof(int)); 26 mkRandomArray(array, SORT_ARRAY_SIZE); 27 array[0] = 0; 28 memcpy(arrayVerify, array, SORT_ARRAY_SIZE*sizeof(int)); 29 30 heapSort(array, SORT_ARRAY_SIZE - 1); 31 32 printArray(array, SORT_ARRAY_SIZE); 33 34 verifySort(arrayVerify, array, SORT_ARRAY_SIZE); 35 36 free(array); 37 free(arrayVerify); 38 return 0; 39 } 40 41 42 void heapSort(int *array, int size) 43 { 44 int loopi; 45 int temp; 46 47 for( loopi = size/2; loopi > 0; loopi-- ) 48 adjustHeap(array, loopi, size); 49 50 for( loopi = size - 1; loopi > 0; loopi-- ) 51 { 52 SWAP( *(array + loopi + 1), *(array + 1), temp ); 53 adjustHeap(array, 1, loopi); 54 } 55 56 } 57 void adjustHeap(int *array, int root, int size) 58 { 59 int child; 60 int temp; 61 62 child = root*2; 63 64 while( child <= size ) 65 { 66 if( child < size && *(array + child) < *(array + child + 1) ) 67 child++; 68 69 if( *(array + child/2) >= *(array + child) ) 70 break; 71 else 72 { 73 SWAP(*(array + child/2), *(array + child), temp); 74 child = 2*(child); 75 } 76 } 77 } 78 79 80 void quickSort(int *array, int begin, int end) 81 { 82 int seed; 83 int pre, fol, tmpval; 84 85 if( begin >= end ) 86 return; 87 88 seed = *(array + begin); 89 pre = begin; 90 fol = end; 91 92 while( pre < fol ) 93 { 94 while( *(array + pre) < seed ) 95 pre++; 96 97 while( *(array + fol) >= seed ) 98 fol--; 99 100 if( pre < fol ) 101 { 102 tmpval = *(array + pre); 103 *(array + pre) = *(array + fol); 104 *(array + fol) = tmpval; 105 } 106 } 107 108 quickSort(array, begin, pre - 1); 109 if( *(array + pre) == seed ) 110 quickSort(array, pre + 1, end); 111 else 112 quickSort(array, pre, end); 113 } 114 115 116 void mergeSort(int *array, int begin, int end) 117 { 118 if( begin >= end ) 119 return; 120 121 int mid; 122 mid = (begin + end)/2; 123 124 mergeSort(array, begin, mid); 125 mergeSort(array, mid + 1, end); 126 merge(array, begin, end); 127 } 128 129 130 void merge(int *array, int begin, int end) 131 { 132 int *tmpArray; 133 int mid, pos1, pos2, posTmpArray; 134 135 tmpArray = (int *)calloc(end - begin + 1, sizeof(int)); 136 mid = (end + begin)/2; 137 pos1 = begin; 138 pos2 = mid + 1; 139 posTmpArray = 0; 140 141 while( pos1 <= mid && pos2 <= end ) 142 { 143 if( *(array + pos1) > *(array + pos2) ) 144 { 145 *(tmpArray + posTmpArray) = *(array + pos2); 146 pos2++; 147 } 148 else 149 { 150 *(tmpArray + posTmpArray) = *(array + pos1); 151 pos1++; 152 } 153 posTmpArray++; 154 } 155 156 if( pos1 > mid ) 157 memcpy(tmpArray + posTmpArray, array + pos2, sizeof(int)*(end - pos2 + 1)); 158 else 159 memcpy(tmpArray + posTmpArray, array + pos1, sizeof(int)*(mid - pos1 + 1)); 160 161 memcpy(array + begin, tmpArray, (end - begin + 1)*sizeof(int)); 162 163 free(tmpArray); 164 } 165 166 167 void insertSort( int *array, int size ) 168 { 169 int loopi, loopj; 170 int pos, tmpval; 171 172 for( loopi = 1; loopi < size ; loopi++ ) 173 { 174 tmpval = *(array + loopi); 175 pos = loopi; 176 177 for( loopj = 0; loopj < loopi; loopj++ ) 178 { 179 if( *(array + loopj) > *(array + loopi) ) 180 { 181 pos = loopj; 182 break; 183 } 184 } 185 186 187 for( loopj = loopi; loopj > pos; loopj-- ) 188 *(array + loopj) = *(array + loopj - 1); 189 190 *(array + pos) = tmpval; 191 } 192 } 193 194 195 void swapSort( int *array, int size ) 196 { 197 int loopi, loopj; 198 int tmpval; 199 200 for( loopi = size; loopi > 0; loopi-- ) 201 { 202 for( loopj = 1; loopj < loopi; loopj++ ) 203 { 204 if( array[loopj] < array[loopj-1]) 205 { 206 tmpval = array[loopj - 1]; 207 array[loopj - 1] = array[loopj]; 208 array[loopj] = tmpval; 209 } 210 } 211 } 212 } 213 214 215 void pickSort(int *array, int size) 216 { 217 int maxpos; 218 int tmpval; 219 int loopi, loopj; 220 221 for( loopi = size; loopi > 0; loopi-- ) 222 { 223 maxpos = 0; 224 for( loopj = 1 ; loopj < loopi ; loopj++ ) 225 maxpos = array[maxpos] < array[loopj] ? loopj : maxpos; 226 227 tmpval = array[loopi - 1]; 228 array[loopi - 1] = array[maxpos]; 229 array[maxpos] = tmpval; 230 } 231 232 } 233 234 235 void mkRandomArray(int *array, int size) 236 { 237 int loopi; 238 srand(time(0)); 239 240 loopi = -1; 241 while( ++loopi < size ) 242 array[loopi] = rand()000; 243 } 244 245 246 247 void printArray(int *array, int size) 248 { 249 int loopi; 250 251 loopi = -1; 252 while( ++loopi < size ) 253 printf("%d: %d\n", loopi, array[loopi]); 254 255 } 256 257 258 void printArrayOneLine(int *array, int begin, int end) 259 { 260 int loopi; 261 262 loopi = begin - 1; 263 while( ++loopi <= end) 264 printf("%d ", array[loopi]); 265 printf("\n"); 266 267 } 268 269 270 int verifySort(int *old, int *sorted, int size) 271 { 272 int loopi, loopj; 273 274 loopi = 0; 275 while(++loopi < size) 276 if(*(sorted + loopi) < *(sorted + loopi - 1)) 277 { 278 printf("Order Verify Failed!!!!"); 279 return 0; 280 } 281 282 283 for( loopi = 0; loopi < size; loopi++ ) 284 { 285 for( loopj = 0; loopj <= size; loopj++ ) 286 { 287 if( loopj == size ) 288 { 289 printf("Memebers Verify Failed!!!!"); 290 return 0; 291 } 292 293 if(*(sorted + loopj) == *(old + loopi)) 294 { 295 *(sorted + loopj) = -1; 296 break; 297 } 298 } 299 } 300 printf("Sort Verify passed!!"); 301 return 1; 302 }
posted on 2012-04-05 16:32 William.Wu 阅读(272) 评论(0) 编辑 收藏 举报