各种排序

各种排序实现,无聊写出来,留个念像。

 

  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编辑  收藏  举报

导航