您的位置:首页 > 其它

【鸽巢排序】对数组排序,要求时间复杂为O(n)

2017-08-04 21:07 507 查看

问题描述

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)
{
if (min > array[idx])
min = array[idx];
if (max < array[idx])
max = array[idx];
}
int size = max - min + 1;
int *count = new int[size];
memset(count, 0, size*sizeof(int));
for (int idx = 0; idx < length; ++idx)
{
count[array[idx]-min]++;
}
//再进行排序

int index = 0;
for (int i = 0; i < size; ++i)
{
//count里面值为0,就跳过,
for (int j = 0; j < count[i]; ++j)
{
array[index++] = min + i;
}
}

delete[]count;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  鸽巢排序
相关文章推荐