【鸽巢排序】对数组排序,要求时间复杂为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; }
相关文章推荐
- 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,
- 一个数组中只有0,1,2三个元素,进行排序,要求时间复杂度为O(n)
- 在已排序的数组中寻找和是给定值的两项,要求时间复杂度为O(n)
- 对数组排序时间复杂度要求O(n)与找中位数不能用排序
- 排序一个数组要求时间复杂度为O(N)
- C++在已排序数组中查找和值确定的第一次出现的两个数(要求时间复杂度为o(n))
- 【练习】输入一个已经按升序排序过的数组和一个数字sum,在数组中查找两个数,使得它们 的和正好是输入的那个数字sum,要求时间复杂度为O(n)
- 要求对数组a进行排序,要求时间复杂度为O(N)
- 14.输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)
- int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N)
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 在旋转后的有序数组中查找元素,要求O(logn)的时间复杂度
- 排序0-n^k-1范围内的n个数,要求时间复杂度为线性
- 某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C/C++代码求出这两个单身整数。 要求: 时间复杂度o(n), 空间复杂度o(1)------某公司招聘试题
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 合并两个排序数组(时间复杂度O(n))
- 求浮点数数组A={A1,A2,A3,…,An}中,Aj-Ai(j>i)的最大值。要求时间复杂度越小越好
- 算法设计:将一个数组分为奇数、偶数左右两个部分,要求时间复杂度为O(n)