- 计数排序(C语言版):空间复杂度=时间复杂度=O(n+k)
算法步骤:
-
花O(n)的时间扫描一下整个序列 A,获取最小值 min 和最大值 max
-
开辟一块新的空间创建新的数组 B,长度为 ( max - min + 1)
-
数组 B 中 index 的元素记录的值是 A 中某元素出现的次数
-
最后输出目标整数序列,具体的逻辑是遍历数组 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 }