问题描述
int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N) 。
分析问题
就已知的算法中,最小的时间见复杂度为O(N lgN):堆排序,快排,归并排序。
题目中的数组元素中的数据范围比较小,最小为12,最大为17。
可以考虑鸽巢排序
(1)找出排序数组中数据的范围,创建计数的数组count
(2)遍历数组,存放到count[array[i]]++
(3) 遍历计数数组,进行排序
void pigeonhole_sort(int array[], int length)
{
//先找出最大值和最小值
int min = array[0];
int max = array[0];
for (int idx = 1; idx < length; ++idx)
{

本文介绍了如何运用鸽巢排序解决一个时间复杂度要求为O(n)的数组排序问题。首先描述了问题背景,即对包含12到17整数的数组进行排序。接着分析,常规的排序算法如堆排序、快排、归并排序的时间复杂度为O(NlgN),不适合此场景。然后提出了利用鸽巢排序的解决方案:确定数据范围,创建计数数组count,遍历原数组更新计数,最后遍历计数数组完成排序。
最低0.47元/天 解锁文章
986

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



