算法导论:第8章 线性时间排序__计数排序
来源:互联网 发布:收发存excel怎么编程 编辑:程序博客网 时间:2024/05/21 22:33
/*计数排序:n个元素都是0到k范围得整数,当k=O(n)时,排序运行时间为O(n)思想:对于数x,确定小于x的个数m,将x放在第m+1个位置上例子:假设3个元素小于x,那么x应该放在4上输入第一行的第一个数n是数组的个数,第一行第二个数表示所有n的元素中最大的数k接下来的第二行就是n个数字输入:8 52 5 3 0 2 3 0 3输出:0 0 2 2 3 3 3 5*/#include <iostream>#include <string.h>#include <stdlib.h>using namespace std;void countSort(int* pArr, int n, int k){//先初始化一个含有k个元素的数组C用于统计,这里k下标需要用到,所以实例化长度为k+1int* cArr = new int[k+1];//注意对于指针数组初始化,不能用memset,只能从头到尾赋值为0//memset(cArr , 0 , k+1);for(int i = 0 ; i <= k ; i++){cArr[i] = 0;}//计数for(int i = 0 ; i < n ; i++){cArr[ pArr[i] ] += 1;}//生成每个元素x小于等于x的个数,这里才用从前向后累加的方式,例如c[1]=c[1]+c[0]=1+1,<=1的元素个数为2,//c[2]=c[2]+c[1]=1+2=3,注意k必须取到for(int i = 1 ; i <= k ; i++){cArr[i] = cArr[i] + cArr[i-1];}//对计数数组进行排序,输入到中间数组B中,该数组的长度为n,在该数组中采用从后向前输出int* bArr = new int[n];for(int i = n - 1 ; i >= 0 ; i--){//B数组的下标应该就是个数,下标最大的是cArr[k]计数最大,但是cArr[k]对应的数字是?,],这里不需要从B数组最大开始摆放,//只需要按照原来数组从后向前摆放,pArr[n-1]对应的是原数组最后一个数字,这个数字最终所在位置是cArr[ pArr[n-1] ]//而cArr[ pArr[n-1] ] - 1,则使得数字pArr[n-1]对应的摆放下标减一,在b数组的摆放位置cArr[ pArr[i] ]中摆放数字pArr[i]int a = pArr[i];int b = cArr[a];//因为这里下标从0开始,因此数字pArr[i]对应的摆放位置cArr[ pArr[i] ]实际需要减1bArr[ cArr[ pArr[i] ] - 1 ] = pArr[i];//使得数字pArr[i]对应的下标减一,防止出现数组中有相同数字的情况,摆放位置减1cArr[ pArr[i] ] -= 1;}//此时B数组中就是结果for(int i = 0 ; i < n ; i++){pArr[i] = bArr[i];}delete[] bArr;delete[] cArr;}void print(int* pArr,int n){for(int i = 0 ; i < n ; i++){cout << pArr[i] << " ";}}void process(){int n , k;while(cin >> n >> k){int* pArr = new int[n];for(int i = 0 ; i < n ; i++){cin >> pArr[i];}countSort(pArr , n , k);print(pArr , n);delete[] pArr;}}int main(int argc,char* argv[]){process();system("pause");return 0;}
0 0
- 算法导论:第8章 线性时间排序__计数排序
- 算法导论:第8章 线性时间排序__基数排序
- 算法导论 第8章 线性时间排序-计数排序的原址排序
- 算法导论 第8章 线性时间排序(计数排序、基数排序、桶排序)
- 《算法导论》第8章 线性时间排序 (1)计数排序
- 算法导论-- 线性时间排序(计数排序、基数排序、桶排序)
- 算法导论学习笔记-第8章 线性时间排序
- 算法导论代码 第8章 线性时间排序
- 算法导论 第8章 线性时间排序
- 算法导论第8章线性时间排序答案
- 算法导论 第8章 线性时间排序 C++实现
- 算法导论第8章—线性时间排序
- 算法导论第8章:线性时间排序
- 《算法导论》第8章 线性时间排序 个人笔记
- [算法导论读书笔记]线性时间排序——计数排序
- 线性时间排序之计数排序(算法导论8.2)
- 计数排序(线性时间排序)--【算法导论】
- 【算法导论】线性时间排序之 决策树&计数排序
- 图像因其本身有错无法显示 解决方法
- 在liunx系统安装一些rpm软件包
- Markdown语法介绍
- 算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),C/C++实现
- 移植tslib1.4到tiny6410
- 算法导论:第8章 线性时间排序__计数排序
- 高等数学:第十一章 无穷级数(2)函数的幂级数展开式、傅里叶级数
- 数据库索引的结构
- Unity Shader编程(3)uv操作
- 【杭电oj】3047 - Zjnu Stadium(带权并查集)
- 高等数学:第十一章 无穷级数(3)正弦级数、余弦级数、周期为2L的周期函数的傅里叶级数
- Android仿微信发图片的样式,做IM的同学的病有救了
- Android中利用ContentResolver获取本地音乐和相片
- [CAAnimation核心动画练习二]关键帧动画,实现抖动