1 计数排序的背景
数组的特点:
- (1)特别容易索引,a[i] 就可以找到i所对应的元素!
- (2)数组的索引,本身就是升序的
那么我们对正整数进行排序的时候,能不能建立一个很大的数组呢?数组中的元素代表正整数出现的次数!
2 代码
2.1 实现方法1
在table中记录待排序数组中每个元素出现次数:
void recordTimes(int *arr, int lenOfArr, int *table)
{
for(int i = 0; i < lenOfArr; i++){
table[arr[i]]++;
}
}
输出排序后的数组:
void outNotZeroIndex(int *table, int lenOfTable, int *sortedArr)
{
int k = 0;
for(int i = 0; i < lenOfTable; i++){ // Index of table
for(int j = 0; j < table[i]; j++){
sortedArr[k++] = i; // Output the index of table
}
}
}
2.2 实现方法2
void CountingSorted(int *arr, int *table, int *sortedArr, int lenOfTable, int lenOfArr)
{
for(int i = 0; i < lenOfTable; i++){ // Clear the Counter
table[i] = 0;
}
for(int i = 0; i < lenOfArr; i++){ // Index of table
table[arr[i]]++;
}
printf("table is: \r\n");
print_table(table, lenOfTable);
for(int i = 0; i < lenOfTable - 1; i++){ // Accumulation of times
table[i+1] = table[i+1] + table[i];
}
printf("table is: \r\n");
print_table(table, lenOfTable);
for(int i = 0; i < lenOfArr; i++){ // Output the index of table
sortedArr[table[arr[i]] - 1] = arr[i];
table[arr[i]]--;
}
}
3 测试例程
3.1 测试数据
int arr[] = {2, 1, 5, 9, 6, 1, 7, 9, 0, 5, 4, 5, 1, 2, 0, 5};
int table[10] = {0};
3.2 测试主程序
int main(int argc, char *argv[])
{
int SortedOut[sizeof(arr)/sizeof(int)] = {0};
printf("Waiting array is:\r\n");
print_intArray(arr, sizeof(arr)/sizeof(int));
printf("Table is : \r\n");
print_table(table, sizeof(table)/sizeof(int));
recordTimes(arr, sizeof(arr)/sizeof(int), table);
printf("After counting, table is : \r\n");
print_table(table, sizeof(table)/sizeof(int));
printf("Sorted array is : \r\n");
outNotZeroIndex(table, sizeof(table)/sizeof(int), SortedOut);
print_intArray(SortedOut, sizeof(SortedOut)/sizeof(int));
return 0;
}
3.3 输出数组和表
输出整型数组
void print_table(int *arr, int len)
{
int i;
printf("=============================================\r\n");
for(i = 0; i < len; i++){
printf("|%-5d", i);
if((i+1) % 10 == 0){
printf("|\r\n");
}
}
if(i % 10 != 0){
printf("|\r\n");
}
printf("---------------------------------------------\r\n");
for(i = 0; i < len; i++){
printf("|%-5d", arr[i]);
if((i+1) % 10 == 0){
printf("|\r\n");
}
}
if(i % 10 != 0){
printf("|\r\n");
}
printf("=============================================\r\n");
}
输出辅助排序的表table
void print_intArray(int *arr, int len)
{
int i;
for(i = 0; i < len; i++){
printf("|%-5d", arr[i]);
if((i+1) % 10 == 0){
printf("|\r\n");
}
}
if(i % 10 != 0){
printf("|\r\n");
}
}