到了这篇文章就说明常见的排序我们就快要讲完了,那这篇文章我们就讲一下非比较排序--计数排序。
一、非比较排序
1.基本思想
计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。 操作步骤:
- 统计相同元素出现次数
- 根据统计的结果将序列回收到原来的序列中
二、计数排序的特性总结
- 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。
- 时间复杂度:O(MAX(N,范围))
- 空间复杂度:O(范围)
- 稳定性:稳定
三、 计数排序
1. 实现思想
计数排序是一种非比较排序,它通过统计数组中每个数据出现的次数,然后根据数据出现的次数和数据的值来重构这个数组,从而将数组排成有序。所以计数排序适合数据范围相对集中且数据为非负整数的情况。
2. 具体实现
void CountSort(int* a, int n)
{int max = a[0], min = a[0];for (int i = 0; i < n; i++){if (min > a[i]){min = a[i];}if (max < a[i]){max = a[i];}}int range = max - min + 1;int* count = (int*)malloc(sizeof(int) * range);if (count == NULL){perror("malloc fail");return;}memset(count, 0, sizeof(int) * range);// 统计数据出现的次数for (int i = 0; i < n; i++){count[a[i] - min]++;}//排序int j = 0;for (int i = 0; i < range; i++){while (count[i]--){a[j++] = i + min;}}
}
四、对于排序的总结