【数据结构】计数排序:有时比快排还快的整数排序法
计数排序
排序思想:
计数排序是一种非比较排序,即不通过两个数的比较来对数组排序。
1. 统计相同元素出现次数
2. 根据统计的结果将序列回收到原来的序列中
了解完这种排序的思想之后,我们很容易想得到:那这样不是很费空间吗?——是的,他很费空间,所以他不适用于数的范围很大的情况。而且他只适用于整形。
但是他很快,只要你范围小,他比快排还快。
/* 计数排序 */
void CountSort(int* a, int n)
{assert(a);int min = a[0];int max = a[0];// 遍历数组找出最大值和最小值,得到范围for (int i = 0; i < n; i++){if (a[i] < min)min = a[i];if (a[i] > max)max = a[i];}// 比如最大值为9,最小值为0,9-0=9,但实际是10个数据// 所以范围要+1int range = max - min + 1;int* countArr = (int*)malloc(sizeof(int) * range);// 初始化一下countArrmemset(countArr, 0, sizeof(int) * range);// 统计次数for (int i = 0; i < n; i++){countArr[a[i] - min]++;}// 排序int index = 0;for (int i = 0; i < range; i++){while (countArr[i]--){a[index] = i + min;index++;}}free(countArr);
}
计数排序特征总结:
1. 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。
2. 时间复杂度:O(N+range)
3. 空间复杂度:O(range)