算法导论8.3-4习题解答(基数排序)
CLRS 8.3-4 :
说明如何在O(n)时间内,对0到n^2 - 1之间的n个整数进行排序。
算法思想:
1.把这n个数看成n进制数,那么每个数只有两位,因而循环只需两次
2.调用通用的基数排序(在这写着,留着以后用)
在此题中,我选择n = 15, 即数组中有15个数,依次为0, 3, 8, ..., 224,但是将顺序打乱了。
PS:在前一篇文章中,计数排序的总时间为O(k+n),在实践中,如果当k = O(n)时,我们常常采用计数排序,这时其运行时间为O(n).
在这里采用的是基数排序,在实践中,其排序时间为O(d*(n+k)),但很耗内存,有时甚至比快速排序更快,具体应用再看。
#include <math.h>
using namespace std;
void radix_sort(int a[], const int d, const int length, int radix);
int getBit(int m, int i, int radix);
int pow2(int a, int b);
int main()
{
//数组长度
const int LEN =15;
int a[LEN] = {35, 48, 0, 8, 15, 80, 99, 3, 24, 168, 195, 224, 63, 120, 143};
//多少位
const int d =2;
//基数
const int radix =15;
//在这调用的是通用的基数排序算法,可以任意改变基数radix,
//但记得改变d,因为radix改变的话,数字的位数会改变,
//最简单的是十进制改成二进制,位数激增
radix_sort(a, d, LEN, radix);
for(int i =0; i < LEN; i++)
cout<<a[i]<<endl;
}
void radix_sort(int a[], const int d, const int length, int radix)
{
//存储a中每个元素的余数
int* remainder =new int[length];
//统计余数(等同于计数排序中的c)
int* c =new int[radix];
//保存排序之后的a
int* b =new int[length];
for(int i =0; i < radix; i++)
c[i] =0;
for(int i =0; i < d; i++)
{
for(int j =0; j < length; j++)
{
int temp = getBit(a[j], i, radix);
remainder[j] = temp;
c[temp]++;
}
for(int k =1; k < radix; k++)
c[k] = c[k] + c[k -1];
for(int k = length -1; k >=0; k--)
{
b[--c[remainder[k]]] = a[k];
//c[remainder[k]]--;
}
for(int k =0; k < radix; k++)
c[k] =0;
for(int i =0; i < length; i++)
a[i] = b[i];
}
delete remainder;
delete c;
delete b;
}
//得到相应位上的数值
int getBit(int m, int i, int radix)
{
return (m%(pow2(radix, i +1)))/pow2(radix, i);
}
//只处理指数b>=0
int pow2(int a, int b)
{
if(b >0)
{
int result = a;
for(int i =0; i < b -1; i++)
result = result*a;
return result;
}
else if(b ==0)
return 1;
else
{
cout<<"不处理指数小于零的情况"<<endl;
return -1;
}
}
算法导论8.3-4习题解答(基数排序)相关推荐
- 算法导论12.2节习题解答
CLRS 12.2-1 C错,240及240之后的节点应该都为911左子树上的节点,那么所有节点必然小于或等于911,但点912明显违反了. CLRS 12.2-2 SEARCH-MINIMUM(x) ...
- 北师范《计算机导论》在线作业,计算机导论教学指导与习题解答简介,目录书摘...
编辑推荐: 根据教育部"高等学校计算机科学与技术专业规范"组织编写 与美国ACM和IEEE CS ComputingCurricula新进展同步 国家精品教材配套用书 ●提供了教材 ...
- 算法导论-3.递归部分习题选
这一部分主要算法导论中递归式.堆排序和快速排序章节里选择的对我而言较有价值的题目. 练习4.1-1 证明 $T(n)=T(\lceil n/2\rceil)+1$ 的解为 $O(\lg n)$ . 解 ...
- 算法导论第二章部分习题自我解答
练习: 2.3-2:去掉合并排序中的哨兵值 #include <iostream> using namespace std; void Merge(int* A, int p, int q ...
- 算法导论第三版习题4.5
4.5-1 a f(n)=1,nlogba=nlog42=n12f(n)=1,n^{log_b a} = n^{log_4 2} = n^{\frac{1}{2}} 当0<ϵ≤12时,f(n)= ...
- 算法导论第七章习题答案(第三版) Introduction to Algorithm
Exercises 7.1-1.略. 7.1-2. 返回的q值等于r,当数组中所有元素都相同时,可以将等于主元的值轮流放到两个集合中. 7.1-3 for循环正好是Θ(n)的复杂度,所以PARTITI ...
- 算法导论第10章习题
10.1-1 略 10.1-2 把这个数组的头和尾各当成一个stack就好了,如果一个stack在push的过程中发现已经有值了就说明放满了. 10.1-3 略 10.1-4 ENQUE,DEQUE中 ...
- 算法导论第三版习题6.4
6.4-1 (a) 首先调用BUILD-MAX-HEAP(A)得到最大堆A1={25,13,20,8,7,13,2,5,4}A_1=\{25,13,20,8,7,13,2,5,4\} (b) 然后将A ...
- 数据结构与算法 Python语言实现 课后习题解答Chapter 2
2.7 Exercises Reinforcement R-2.1 Give three examples of life-critical software applications. https: ...
最新文章
- 6s如何无线连电脑连接服务器,iPhone 6s无线连接能力:WiFi与4G大提速
- JMS Java消息服务(Java Message Service)
- 2021-11-05 虚拟机centos7更改root与home分区大小
- vue axios 发送get请求传递参数给后端失败_Java之Vue插件之Axios
- SQL Server T-SQL编程:数据库用户与安全设置
- java 基本类型 线程安全_java的基本类型和i++线程安全性的深入解析
- 【单片机实验】矩阵键盘
- Bootstrap 分页导航的尺寸
- 华为交换机模拟器_从零开始学习华为路由交换 | 配置缺省静态路由
- numpy 常用api(二)
- 【DL】一文读懂深度学习中的N种卷积
- LaTeX插入Visio绘图,文字模糊
- CAXA图文档2007服务器端,CAXA图文档客户端系统管理员操作.doc
- 配置安装跟踪服务器Tracker 配置FastDFS存储服务器 Storage
- 中国石油大学《输气管道设计与管理(含课程设计)》第三阶段在线作业
- 三字经带注解_三字经注释及解析
- matlab 空集判定,在使用matlab 符号运算中的solve函数时,为啥计算的结果是空集?该怎么办?...
- 电脑一会,电脑一会黑屏一会正常怎么回事
- 实验:高次插值的龙格现象(Runge)实验
- 引流产品分几类?引流产品结构四类定位产品