参考:https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247484043&idx=1&sn=3743a5e3f79fba00ca794704e0c5a1ba&scene=19#wechat_redirect

  • 计数排序(C语言版):空间复杂度=时间复杂度=O(n+k)

  算法步骤:

  1. 花O(n)的时间扫描一下整个序列 A,获取最小值 min 和最大值 max

  2. 开辟一块新的空间创建新的数组 B,长度为 ( max - min + 1)

  3. 数组 B 中 index 的元素记录的值是 A 中某元素出现的次数

  4. 最后输出目标整数序列,具体的逻辑是遍历数组 B,输出相应元素以及对应的个数

  

  算法演示:

  

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 void count_sort(int A[],int length){
 5     /*时间复杂度=空间复杂度 = O(n+k)
 6      * 参考:https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247484043&idx=1&sn=3743a5e3f79fba00ca794704e0c5a1ba&scene=19#wechat_redirect
 7      * 1.花O(n)的时间扫描一下整个序列 A,获取最小值 min 和最大值 max
 8      * 2.开辟一块新的空间创建新的数组 B,长度为 ( max - min + 1)
 9      * 3.数组 B 中 index 的元素记录的值是 A 中某元素出现的次数
10      * 4.最后输出目标整数序列,具体的逻辑是遍历数组 B,输出相应元素以及对应的个数
11      */
12 
13     //寻找最大值与最小值。
14     int max = A[0],min = A[0];
15     for(int i = 0;i < length;i++){
16         if(max < A[i]){
17             max = A[i];
18         }
19         if(min > A[i]){
20             min = A[i];
21         }
22     }
23     //构造新数组,并置零。
24     int range = max-min+1;
25     int B[range];
26     memset(B,0, sizeof(B));
27     //统计每个数出现次数,将次数赋予B数组
28     for(int i = 0;i < length;i++){
29         B[A[i] - min]++;
30     }
31     //按照B数组中每个数字的次数,输出排序后的A数组
32     int index = 0;
33     for(int i = 0;i < range;i++){
34         while(B[i] --){
35             A[index] = i + min;
36             index++;
37         }
38     }
39     //输出
40 //    for(int i = 0;i< length;i++){
41 //        printf("%d ",A[i]);
42 //    }
43 }
44 
45 
46 int main (){
47     int A[] = {5,3,4,7,2,4,3,4,7};
48     int length = sizeof(A)/sizeof(int);
49     count_sort(A,length);
50     
51     return 0;
52 }
View Code

 

posted on 2019-03-21 09:46  kingofloong  阅读(1066)  评论(0编辑  收藏  举报