计数排序:时间复杂度O(n+k),空间复杂度O(k)
来源:互联网 发布:卓智是锐捷网络控股么 编辑:程序博客网 时间:2024/06/09 19:56
- 问题描述
假设n个记录中每个关键字都介于0到k-1之间,修改计数排序算法,使得算法满足:
时间复杂度:O(n+k),空间复杂度:n+O(k)
- 问题分析
原计数排序算法中,需借助另一个大小为n的数组进行排序,不能做到原地排序,如何实现原地排序?
原计数排序算法中,对数组中的每个元素,都已计算出了比其小或相等的元素个数,即确定了其最终位置。每个元素都已确定了自身的最终位置,但如何实现原地排序?
- 解决思路
从数组最后一个元素array[array.size()-1]开始,将其交换至最终位置上,并对交换后的array[array.size()-1]继续执行此操作,直至该元素的最终位置即为此位置为止,此后,对下一个位置执行相同操作,直至执行至数组的第二个位置为止。
但存在一个问题,当数组存在相同元素时,若其中一个元素已在其最终位置A[j],当对另一个元素交换至其最终位置的过程中,发现其最终位置已存在与其相等的元素,此时,应将该元素交换至A[k]处,A[k]为从j往前的第一个不同于该元素的位置。
- 实现代码
C++实现,其中数组用vector<pair<int, int> >存储,pair的第一个元素为待排序元素,第二个元素为该元素的重复个数,用以确定该算法是否稳定。
void counting_sort(vector<pair<int, int> > &array, int k) { vector<int> array_count(k, 0); for (vector<pair<int, int> >::const_iterator iter = array.begin(); iter != array.end(); ++iter) ++array_count[iter->first]; for (size_t i = 1; i != array_count.size(); ++i) array_count[i] += array_count[i-1]; for (int i = array.size() -1; i != 0; --i) { int j = array_count[array[i].first] - 1; if (j != i) { while (j >= 0 && j != i && array[j].first == array[i].first) --j; if (j != i) { if (j == -1) j = 0; pair<int, int> temp = array[i]; array[i] = array[j]; array[j] = temp; ++i; } } }}
- 计数排序:时间复杂度O(n+k),空间复杂度O(k)
- 计数排序,传说中时间复杂度O(n+k)的排序算法
- 字符串移动k位的时间复杂度o(n)空间复杂度o(1)的解法
- 计数排序算法,时间复杂度O(n),空间复杂度O(1)
- 时间复杂度O(n),空间复杂度O(1)的排序
- 寻找最小的k个数 时间复杂度 O(n*k)
- O(N)时间复杂度的排序算法-计数排序
- 面试题:top k算法O(n)时间复杂度
- 找第k大数,最坏时间复杂度O(n)
- 时间复杂度为O(n)的排序算法--计数算法
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 一个在终端实现类Linux shell(cd ls命令)UI界面的项目(C语言实现)
- 如何获取iphone的硬件版本以及系统信息
- directUI开源库
- 完美解决IE6不支持position:fixed的bug
- Android 应用介绍、应用导航 ViewPager
- 计数排序:时间复杂度O(n+k),空间复杂度O(k)
- MFC对多线程编程的支持
- Solr高亮查询例子
- Android Coverflow 立体专辑封面效果
- 74HC595驱动数码管
- 容器vector list queue 迭代器iterator
- linux内核之旅网址
- Timer和TimerTask详解 -转载
- Ranorex安装初步(android 自动化测试)