排序

  1 计数排序
  2 #include<iostream>
  3 #include<assert.h>
  4 using namespace std;
  5 //void countSort(int *a, size_t size)
  6 //{
  7 //        assert(a);
  8 //        int max = a[0]; 
  9 //        int min = a[0];
 10 //        for (size_t i = 1; i < size; i++)
 11 //        {
 12 //            if (a[i] < min)
 13 //            {
 14 //                min = a[i];
 15 //            }
 16 //            else if (a[i] > max)
 17 //            {
 18 //                max = a[i];
 19 //            }
 20 //        }
 21 //        int range = max - min + 1;
 22 //        int *countArray = new int[range];
 23 //        //memset(countArray, 0, sizeof(int)*range);
 24 //        for (size_t i = 0; i < range; i++)
 25 //        {
 26 //            countArray[i]=0;
 27 //        }
 28 //        for (size_t i = 0; i < size; i++)
 29 //        {
 30 //            countArray[a[i] - min]++;
 31 //        }
 32 //        size_t index = 0;
 33 //        for (size_t i = 0; i < range; i++)
 34 //        {
 35 //            while (countArray[i]--> 0)
 36 //            {
 37 //                a[index++] = i + min;
 38 //            }
 39 //        }
 40 //}
 41 void PrintArray(int *a, size_t size)
 42 {
 43     assert(a);
 44     for (size_t i = 0; i<size; i++)
 45     {
 46         cout<<a[i]<<" ";
 47     }
 48     cout << endl;      
 49 }
 50 
 51 基数排序
 52 int GetMaxDigit(int *a, size_t size)
 53 {
 54     int digit = 1;
 55     int max = 10;
 56     for (size_t i = 0; i < size; i++)
 57     {
 58         while (a[i] >= max)
 59         {
 60             ++digit;
 61             max *= 10;
 62         }
 63     }
 64     return digit;
 65 }
 66 void DigitSortLSD(int*a, size_t size)
 67 {
 68     assert(a);
 69     int MaxBit = GetMaxDigit(a, size);
 70     int *bucket = new int[size];
 71     int count[10]; int start[10];
 72     int bit = 1;
 73     int digit = 1;
 74     while (bit<=MaxBit)
 75     {
 76         memset(count, 0, sizeof(int) * 10);
 77         memset(start, 0, sizeof(int) * 10);
 78         for (size_t i = 0; i < size; i++)
 79         {
 80             int num = (a[i] / digit) % 10;
 81             count[num]++;
 82         }
 83         start[0] = 0;
 84         for (size_t i = 1; i < size; i++)
 85         {
 86             start[i] = start[i - 1] + count[i - 1];
 87 
 88         }
 89         for (size_t i = 0; i < size; i++)
 90         {
 91             int num = (a[i] / digit) % 10;
 92             bucket[start[num]++]=a[i];
 93         }
 94         memcpy(a, bucket, sizeof(int) * 10);
 95         digit *= 10;
 96         ++bit;
 97     }
 98 
 99 }
100 void  main()
101 {
102     int  br[] = { 20, 80, 90, 589, 998, 965, 852, 123, 456, 789 };
103     int len = sizeof(br) / sizeof(int);
104     cout << "原数据如下:" << endl;
105     PrintArray(br, len);
106     cout << "排序后数据如下:" << endl;
107     //countSort(br, len);
108     DigitSortLSD(br, len);
109     PrintArray(br, len);
110     system("pause");
111 }
112     
113 
114 
115 希尔排序
116 #include<iostream>
117 #include<assert.h>
118 using namespace std;
119 void ShellSort(int *a,size_t size)
120 {
121     assert(a);
122     int gap = size;
123     while (gap > 1)
124     {
125         gap = gap / 3 + 1;
126         for (int i = gap; i < size; ++i)
127         {
128             int index = i;
129             int tmp = a[index];
130             int end = index - gap;
131             while (end>=0&&a[end] > tmp)
132             {
133                 a[end + gap] = a[end];
134                 end -= gap;
135             }
136             a[end + gap] = tmp;
137         }
138     }
139 }
140 void Print(int *a, size_t size)
141 {
142     for (size_t i = 0; i < size; ++i)
143     {
144         cout << a[i] << " ";
145     }
146     cout << endl;
147 }
148 void main()
149 {
150     int a[10] = { 2,5,4,9,3,6,8,7,1,0 };
151     Print(a, 10);
152     ShellSort(a, 10);
153     Print(a, 10);
154     system("pause");
155 }
156 
157 归并排序
158 
159 #include<iostream>
160 #include<assert.h>
161 using namespace std;
162 
163 void mergearray(int *a, int first, int mid, int last, int *temp)
164 {
165     int i = first, j = mid + 1;
166     int m = mid, n = last;
167     int k = 0;
168     while (i <= m && j <= n)
169     {
170         if (a[i] <= a[j])
171             temp[k++] = a[i++];
172         else
173             temp[k++] = a[j++];
174     }
175 
176     while (i <= m)
177         temp[k++] = a[i++];
178 
179     while (j <= n)
180         temp[k++] = a[j++];
181 
182     for (i = 0; i < k; i++)
183         a[first + i] = temp[i];
184 }
185 void mergesort(int *a, int first, int last, int *temp)
186 {
187     if (first < last)
188     {
189         int mid = (first + last) / 2;
190         mergesort(a, first, mid, temp);     
191         mergesort(a, mid + 1, last, temp);  
192         mergearray(a, first, mid, last, temp);  
193     }
194 }
195 
196 bool MergeSort(int *a, int n)
197 {
198     int *p = new int[n];
199     if (p == NULL)
200         return false;
201     mergesort(a, 0, n - 1, p);
202     delete[] p;
203     return true;
204 }
205 
206 void printArray(int *a, int len)
207 {
208     for (int i = 0; i<len; i++)
209         cout << a[i] << " ";
210     cout << endl;
211 }
212 
213 int main()
214 {
215     int a[] = { 49, 38, 65, 97, 76, 13, 27, 49 };
216     int len = sizeof(a) / sizeof(int);
217     printArray(a, len);
218     MergeSort(a, len);
219     printArray(a, len);
220     system("PAUSE");
221     return 0;
222 }
223 
224 //void mergearray(int *a, int begin1, int end1, int begin2,int end2, int *temp)
225 //{
226 //    assert(a);
227 //    int index = begin1;
228 //    while (begin1 <= end1&& begin2<= end2)
229 //    {
230 //        if (a[begin1] <=a[begin2])
231 //            temp[index++] = a[begin1++];
232 //        else
233 //            temp[index++] = a[begin2++];
234 //    }
235 //
236 //    while (begin1 <= end1)
237 //    {
238 //        temp[index++] = a[begin1++];
239 //    }
240 //
241 //    while (begin2 <= end2)
242 //    {
243 //        temp[index++] = a[begin2++];
244 //
245 //    }
246 //
247 //    for (int i = 0; i < index; i++)
248 //    { 
249 //        a[begin1 + i] = temp[i];
250 //    }
251 //    
252 //}
253 //void mergesort(int *a, int first, int last, int *temp)
254 //{
255 //    assert(a);
256 //    if (first < last)
257 //    {
258 //        int mid = first +(last-first) / 2;
259 //        mergesort(a, first, mid, temp);     
260 //        mergesort(a, mid + 1, last, temp);  
261 //        mergearray(a, first, mid,mid+1, last, temp);  
262 //        //memcpy(a + first, temp + first, (last - first - 1)*sizeof(int));
263 //    }
264 //}
265 //bool MergeSort(int *a, int n)
266 //{
267 //    int *p = new int[n];
268 //    if (p == NULL)
269 //        return false;
270 //    mergesort(a, 0, n - 1, p);
271 //    delete[] p;
272 //    return true;
273 //}
274 //void printArray(int *a, int len)
275 //{
276 //    for (int i = 0; i<len; i++)
277 //        cout << a[i] << " ";
278 //    cout << endl;
279 //}
280 //
281 //int main()
282 //{
283 //    int a[] = { 49, 38, 65, 97, 76, 13, 27, 49 };
284 //    int len = sizeof(a) / sizeof(int);
285 //    printArray(a, len);
286 //    MergeSort(a, len);
287 //    printArray(a, len);
288 //    system("PAUSE");
289 //    return 0;
290 //}
291 
292 插入排序
293 
294 #include<assert.h>
295 #include<iostream>
296 using namespace std;
297 void InsertSort(int *a, size_t size)
298 {
299     assert(a);
300     for (int i = 1; i < size; ++i)
301     {
302         int index = i;
303         int tmp = a[index];
304         int end = index - 1;
305         while (end >= 0 && a[end]>tmp)
306         {
307             a[end + 1] = a[end];
308             --end;
309         }
310         a[end + 1] = tmp;
311     }
312 }
313 void PrintArray(int *a, size_t size)
314 {
315     assert(a);
316     for (int i = 0; i < size; ++i)
317     {
318         cout << a[i] << " ";
319     }
320     cout << endl;
321 }
322 void TestInsertSort()
323 {
324     int a[10] = { 2, 5, 4, 9, 3, 6, 8, 7, 1, 0 };
325     PrintArray(a, 10);
326     InsertSort(a, 10);
327     PrintArray(a, 10);
328 }
329 
330 
331 堆排序
332 
333 #include<assert.h>
334 #include<iostream>
335 using namespace std;
336 void AdjustDown(int *a,size_t size,int root)
337 {
338     assert(a);
339     int child = 2 * root + 1;
340     while (child < size)
341     {
342         if (child + 1 < size&&a[child + 1] > a[child])
343         {
344             ++child;
345         }
346         if (a[child]>a[root])
347         {
348             swap(a[child], a[root]);
349             root = child;
350             child = 2 * root + 1;
351         }
352         else
353         {
354             break;
355         }
356     }
357 }
358 void HeapSort(int *a, size_t size)
359 {
360     assert(a);
361     for (int i = (size-2)/2; i >=0; --i)
362     {
363         AdjustDown(a,size,i);
364     }
365     for (size_t i = size - 1; i > 0; --i)
366     {
367         swap(a[0], a[i]);
368         AdjustDown(a, i, 0);
369     }
370 }
371 void PrintArray(int *a, size_t size)
372 {
373     assert(a);
374     for (int i = 0; i < size; ++i)
375     {
376         cout << a[i] << " ";
377     }
378     cout << endl;
379 }
380 void TestHeapSort()
381 {
382     int a[10] = { 2, 5, 4, 9, 3, 6, 8, 7, 1, 0 };
383     PrintArray(a, 10);
384     HeapSort(a, 10);
385     PrintArray(a, 10);
386 }
387 int main()
388 {
389     TestHeapSort();
390     system("pause");
391     return 0;
392 }

 

posted @ 2016-04-27 18:34  *尘封的记忆*  阅读(169)  评论(0编辑  收藏  举报