一、计数排序
计数排序假设n个输入元素中的每一个都是介于1到k之间的整数,此处k是整数。当k = O(n) 时,计数排序的运行时间为O(n) 。
计数排序算法的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。
CountingSortMain.c
#include <stdio.h>
#include <stdlib.h>
#define ARRLEN 9
void CountingSort(int *a, int *b, int arrLen, int k);
void PrintArr(int *arr, int arrLen);
int ArrMaxElem(int *arr, int arrLen);

/**//*
*n为数组a的长度,k为数组a中最大值。
*c[i]记录a数组中数值大于或等于i的个数
*/
void CountingSort(int *a, int *b, int arrLen, int k)
...{
int i;
int *c;
c = (int *)malloc((k + 1) * sizeof(int));
for(i = 0; i <= k; i++)
c[i] = 0;
/**//*c[i]包含等于i的元素个数*/
for(i = 0; i < arrLen; i++)
c[a[i]]++;
/**//*c[i]包含小于等于i的元素个数*/
for(i = 1; i <= k; i++)
c[i] += c[i-1];
for(i = arrLen - 1; i >= 0; i--)
...{
b[c[a[i]] - 1] = a[i];
c[a[i]]--;
}
free(c);
c = NULL;
}
void PrintArr(int *arr, int arrLen)
...{
int i;
for(i = 0; i < arrLen; i++)
printf("%3d ", arr[i]);
printf(" ");
}
int ArrMaxElem(int *arr, int arrLen)
...{
int i, max;
max = arr[0];
for(i = 1; i < arrLen; i++)
if(max < arr[i])
max = arr[i];
return max;
}
int main(int argc, char **argv)
...{
int a[ARRLEN] = ...{4, 4, 3, 1, 1, 9, 8, 11, 8} ;
int b[ARRLEN] = ...{0, };
CountingSort(a, b, ARRLEN, ArrMaxElem(a, ARRLEN));
PrintArr(b, ARRLEN);
return 0;
}
本文介绍了一种线性时间复杂度的排序算法——计数排序。适用于整数范围已知的情况,通过计算每个可能元素出现的次数来实现排序。特别地,当整数范围与输入规模相当时,计数排序效率极高。
5149

被折叠的 条评论
为什么被折叠?



