线性排序算法

 1. 计数排序

已知输入数组input[0...n-1],  任意 x IN input[], 如果已知有C[x]个数 <= x,那么 x 应该放在第 C[x] 个位置

例如:10个5岁以下的小朋友按照年龄排序,如果知道 <= 3岁的小朋友有6个,那么年龄为3岁的小朋友应该站在第6个位置。 

 1 #define MAX     10
 2 #define key(x)  x
 3 int C[MAX];
 4 
 5 void counting_sort(int input[], int output[], int n, int k)
 6 {
 7     int i, j;
 8 
 9     for (j = 0; j < n; j++)
10         C[key(input[j])]++;
11     
12     for (i = 1; i < k; i++)
13         C[i] = C[i] + C[i - 1]; 
14 
15     for (j = n - 1; j >= 0; j--)
16     {   
17         output[C[key(input[j])] - 1] = input[j];
18         C[key(input[j])]--;
19     }   
20 }

优点:

1、稳定排序

2、时间复杂度O(n)

缺点:

待排序数组元素介于[0, k]之间,当k很大时需要占用大量空间,限制了计数排序的使用范围。

原文地址:https://www.cnblogs.com/ym65536/p/4299897.html