码迷,mamicode.com
首页 > 编程语言 > 详细

计数排序

时间:2014-11-06 19:15:58      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   for   sp   数据   div   on   

 1 //计数排序的思想是这样的,如果小于等于a的数字有n个,那么就把a放在第n+1个位置,从而达到排序的目的
 2 //关键是怎么统计小于等于a的数字有多少个,
 3 /*
 4 可以采用这样一个办法,将数组元素的值映射为下标,统计该下标出现了多少次,然后再统计比该下标小或者等的下标出现了多少次,
 5 从而就统计出了小于等于a的数字有多少个
 6 */
 7 
 8 //计数排序的时间复杂度为O(n), 但是缺点为数据有多大,数据就要开多大。
 9 #include <stdio.h>
10 #include <string.h>
11 const int N = 1000;
12 int a[N],b[N];
13 int c[1000000];
14 
15 
16 void countingSort(int n, int m)
17 {
18     int i;
19     for(i=0; i<=m; ++i) c[i] = 0;
20     for(i=0; i<n; ++i) c[a[i]] ++;//将a[i] 映射为下标,统计该下标出现了多少次
21     for(i=1; i<=m; ++i) c[i] += c[i-1];//统计比该小或者等的下标出现了多少次
22     //for(i=n-1; i>=0; --i) //稳定
23     for(i=0; i<n; ++i)//不稳定
24     b[--c[a[i]]] = a[i];//c[]记录了小于等于a[i]的数字有多少个,直接将a[i]放在相应的位置上去
25 }
26 int main()
27 {
28     int n,m,i;
29     scanf("%d",&n);
30     m = -1;
31     for(i=0; i<n; ++i)
32     {
33         scanf("%d",&a[i]);
34         m = a[i] > m ? a[i] : m;
35     }    
36     countingSort(n, m);
37     for(i=0; i<n; ++i)
38         printf("%d ",b[i]);
39     
40     return 0;
41 }

 

计数排序

标签:style   blog   io   color   for   sp   数据   div   on   

原文地址:http://www.cnblogs.com/justPassBy/p/4079281.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!