算法导论 基数排序 习题8.3-4
2015-05-17 19:08
821 查看
问题: 在O(n)时间内,对0到n^3-1区间内的n个整数进行排序
思路:线性时间,考虑使用基数排序,基数排序时间为
,要使时间为O(n),
,即k=n,
即把每个整数写成3位n进制数
代码:
思路:线性时间,考虑使用基数排序,基数排序时间为
,要使时间为O(n),
,即k=n,
即把每个整数写成3位n进制数
代码:
#include<iostream> #include<stdlib.h> #include<time.h> #include<math.h> using namespace std; //基于计数排序的n个数根据第i为排序 void CountSort(int *A, int *B,int n, int k) { int *C=new int [n+1];//存储按n个数第i位(数组B)排序得到的A int *D=new int [k+1]; for(int p=0;p<k+1;p++)//一定要初始化 D[p]=0; for(int i=0;i<n;i++) ++D[B[i]]; for(int j=1;j<k+1;j++)//[0,...k] D[j]=D[j]+D[j-1]; for(int l=n-1;l>-1;l--) { C[D[B[l]]-1]=A[l];//这个地方的下标要注意 --D[B[l]]; } for(int m=0;m<n;m++)//避免返回new分配内存的变量,避免内存泄露 A[m]=C[m]; delete[] C; delete[] D; } //基于基数排序的0到n^3-1区间内的n个数的排列 void RadixSort(int *A, int n,int d) { int *B=new int ;//存储转化为d位n进制数的第i位 for(int i=1;i<=d;i++) { for(int j=0;j<n;j++) { B[j]=A[j]%(int)pow(n,i)/(int)pow(n,(i-1)); } CountSort(A,B,n,n-1); } delete[] B; } int main() { int a[10];//n=10 srand((unsigned)time(NULL)); for(int i=0;i<10;i++) { a[i]=rand()%1000; cout<<a[i]<<" "; } cout<<endl; RadixSort(a,10,3); for(int j=0;j<10;j++) cout<<a[j]<<" "; cout<<endl; return 0; }
相关文章推荐
- 算法导论CLRS 8.3 基数排序
- 算法导论8.3-4习题解答(基数排序)
- 《算法导论》习题8.3
- 算法导论第三版习题8.3
- 《算法导论》笔记 第8章 8.3基数排序
- 《算法导论》笔记 第8章 8.3基数排序
- 算法导论习题8.3-4
- 算法导论8-3(a)习题解答(基数排序)
- 算法导论习题:寻找第2小元素&&关于常见排序算法的稳定性分析和结论
- 刘汝佳黑书 算法导论习题
- 算法导论12.2节习题解答
- 算法导论习题解-第17章摊还分析
- 算法导论习题解-第21章用于不相交集合的数据结构
- 算法导论习题解-第24章单源最短路径
- 算法导论动态规划课后习题解答
- 算法导论14-2习题解答 Josephus排列(约瑟夫环)
- 算法导论(第三版)习题解答9.1-1(找第二小的元素)
- 《算法导论》笔记(1)排序 含部分习题
- 算法导论-2.随机算法习题选
- 《算法导论》习题2.1-3