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 <iostream>
#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习题解答(基数排序)相关推荐

  1. 算法导论12.2节习题解答

    CLRS 12.2-1 C错,240及240之后的节点应该都为911左子树上的节点,那么所有节点必然小于或等于911,但点912明显违反了. CLRS 12.2-2 SEARCH-MINIMUM(x) ...

  2. 北师范《计算机导论》在线作业,计算机导论教学指导与习题解答简介,目录书摘...

    编辑推荐: 根据教育部"高等学校计算机科学与技术专业规范"组织编写 与美国ACM和IEEE CS ComputingCurricula新进展同步 国家精品教材配套用书 ●提供了教材 ...

  3. 算法导论-3.递归部分习题选

    这一部分主要算法导论中递归式.堆排序和快速排序章节里选择的对我而言较有价值的题目. 练习4.1-1 证明 $T(n)=T(\lceil n/2\rceil)+1$ 的解为 $O(\lg n)$ . 解 ...

  4. 算法导论第二章部分习题自我解答

    练习: 2.3-2:去掉合并排序中的哨兵值 #include <iostream> using namespace std; void Merge(int* A, int p, int q ...

  5. 算法导论第三版习题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)= ...

  6. 算法导论第七章习题答案(第三版) Introduction to Algorithm

    Exercises 7.1-1.略. 7.1-2. 返回的q值等于r,当数组中所有元素都相同时,可以将等于主元的值轮流放到两个集合中. 7.1-3 for循环正好是Θ(n)的复杂度,所以PARTITI ...

  7. 算法导论第10章习题

    10.1-1 略 10.1-2 把这个数组的头和尾各当成一个stack就好了,如果一个stack在push的过程中发现已经有值了就说明放满了. 10.1-3 略 10.1-4 ENQUE,DEQUE中 ...

  8. 算法导论第三版习题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 ...

  9. 数据结构与算法 Python语言实现 课后习题解答Chapter 2

    2.7 Exercises Reinforcement R-2.1 Give three examples of life-critical software applications. https: ...

最新文章

  1. 6s如何无线连电脑连接服务器,iPhone 6s无线连接能力:WiFi与4G大提速
  2. JMS Java消息服务(Java Message Service)
  3. 2021-11-05 虚拟机centos7更改root与home分区大小
  4. vue axios 发送get请求传递参数给后端失败_Java之Vue插件之Axios
  5. SQL Server T-SQL编程:数据库用户与安全设置
  6. java 基本类型 线程安全_java的基本类型和i++线程安全性的深入解析
  7. 【单片机实验】矩阵键盘
  8. Bootstrap 分页导航的尺寸
  9. 华为交换机模拟器_从零开始学习华为路由交换 | 配置缺省静态路由
  10. numpy 常用api(二)
  11. 【DL】一文读懂深度学习中的N种卷积
  12. LaTeX插入Visio绘图,文字模糊
  13. CAXA图文档2007服务器端,CAXA图文档客户端系统管理员操作.doc
  14. 配置安装跟踪服务器Tracker 配置FastDFS存储服务器 Storage
  15. 中国石油大学《输气管道设计与管理(含课程设计)》第三阶段在线作业
  16. 三字经带注解_三字经注释及解析
  17. matlab 空集判定,在使用matlab 符号运算中的solve函数时,为啥计算的结果是空集?该怎么办?...
  18. 电脑一会,电脑一会黑屏一会正常怎么回事
  19. 实验:高次插值的龙格现象(Runge)实验
  20. 引流产品分几类?引流产品结构四类定位产品

热门文章

  1. iOS小知识点(非UI部分)
  2. JAVA取随机数,石头剪刀布实例
  3. JS ===和==区别
  4. iOS 键盘风格详解UIKeyboardType
  5. Spring Boot 统一结果封装
  6. 递归函数实现二分查找法
  7. [树形dp] Jzoj P1046 寻宝之旅
  8. 微信开发中,H5的video标签使用
  9. Dalsa线扫相机SDK开发-小试牛刀(1)
  10. DELPHI设置枚举类型size