《算法导论》CLRS算法C++实现(六)P100 基数排序
第八章 线性时间排序
8.3 基数排序
算法导论上对基数排序的算法描述只有两行。。。 微言大义的说。。。
RADIX-SORT(A, d)
1 for i ← 1 to d 2 do use a stable sort to sort array A on digit i
C++代码
1 #include <iostream> 2 3 using namespace std; 4 5 //求数组中数字的最大位数 6 int maxDigit(int* arr,int digit) 7 { 8 int n = 0; 9 int* temp = new int[digit]; 10 for(int i = 0; i < digit; i++) 11 temp[i]= arr[i]; 12 for(int i = 0; i < digit; i++) 13 { 14 int counter =1; 15 while(temp[i] / 10 > 0) 16 { 17 counter++; 18 temp[i] /= 10; 19 } 20 if(n < counter) 21 n = counter; 22 } 23 delete[] temp; 24 return n; 25 } 26 27 //基数排序 28 void radixSort(int* arr, int digit) 29 { 30 int n = maxDigit(arr, digit); 31 int* temp = new int[digit]; 32 int* count = new int[10]; 33 int i, j, k; 34 int radix = 1; 35 for(i = 1; i <= n; i++) 36 { 37 for(j = 0; j < 10; j++) 38 count[j] = 0; 39 for(j = 0; j < digit; j++) 40 { 41 k = (arr[j] / radix) % 10; 42 count[k]++; 43 } 44 for(j = 1; j < 10; j++) 45 count[j] = count[j-1] + count[j]; 46 for(j = digit - 1; j >= 0; j--) 47 { 48 k = (arr[j] / radix) % 10; 49 count[k]--; 50 temp[count[k]] = arr[j]; 51 } 52 for(j = 0; j < digit; j++) 53 arr[j] = temp[j]; 54 radix *= 10; 55 } 56 delete[] temp; 57 delete[] count; 58 } 59 60 int main() 61 { 62 int a[] = {22, 34, 95, 87, 56, 980, 12, 48}; 63 radixSort(a, 8); 64 for(int i = 0; i < 8; i++) 65 { 66 cout << a[i] << " "; 67 } 68 cout << endl; 69 return 0; 70 }
在C++实现中,我使用了一个辅助的函数 int maxDigit(int* arr,int digit)来计算待排序数组中最大的数位,以使程序有更大的适用范围,不需要待排序的数字位数相同。
基数排序的算法很直观。在一个数组中,每个元素都有d位数字,其中第1位是最低位,第d位是最高位。依次判断每个位置的排序。基数排序需要另一种稳定的排序算法(stable sort)进行辅助。
转载于:https://www.cnblogs.com/juventus/archive/2012/06/06/2538244.html
《算法导论》CLRS算法C++实现(六)P100 基数排序相关推荐
- 算法设计与分析_算法导论(CLRS)骨灰级笔记分享:目录
倘若你去问一个木匠学徒:你需要什么样的工具进行工作,他可能会回答你:"我只要一把锤子和一个锯".但是如果你去问一个老木工或者是大师级的建筑师,他会告诉你"我需要一些精确的 ...
- 算法导论——A*算法易懂的证明
算法导论--A*算法易懂的证明 前言 A* 证明 证明采用反证法,课上老师讲解不够清晰,课后自己下了点功夫,明白了A * 算法的原理. 前言 A*算法,其核心思想在于f(n)和Best-First.其 ...
- 算法导论 CLRS 第26章 最大流 Maximum flow C#
2021/11/26 第六部分 图算法 第22章 基本的图算法 图数据结构设计 出度.入度和度 有向图 出度≠入度 先初始化出度,再初始化入度,u.入度=u.AdjList.length-u.out_ ...
- 算法导论——排序算法
学习<算法导论>学习感受 转载于:https://www.cnblogs.com/xuddong/archive/2013/04/10/3012567.html
- 算法导论 CLRS 22.4-4 解答
先说结论: 对于有环图,top排序不一定可以生成坏边最小的序列 证明: 1. 假设G至少需要去掉k条边才能变成无环图,则任意序列P的坏边数目bad[P] >= k: 证明: 如果存在P使得bad ...
- 算法导论 CLRS 23.3 解答 (未完成)
a) T为G的一个最小生成树,(u,v)为T中的任意一条边,可以证明(u,v)是G中所有u--->v的路径中的最小的边, 反正法:假设u--->v的某条路径P中存在一条边(x,y)的权重小 ...
- 算法导论——贪心算法:哈夫曼编码(霍夫曼编码)
2019独角兽企业重金招聘Python工程师标准>>> package org.loda.greedy;import org.junit.Test; import org.loda. ...
- 算法导论-排序算法-分治法
1.分治法原理 所谓的分治指的就是分而治之,即将大规模的问题分解成几个较小规模的问题.通过对较小规模问题的求解达到对整个问题的的求解.当我们将问题分解成两个较小问题求解时的分治方法就是二分法. 分支的 ...
- 组合数学 算法导论 具体数学 博弈论 计算机科学数学
组合数学[清华大学] https://www.bilibili.com/video/BV1sW411V7RU 15日掌握<具体数学>第1天学习直播实况记录(2019.5.27) https ...
- 重读《算法导论》第一章
重读<算法导论> --------算法是程序的灵魂! 驱动力:本人从事开发10年有余,目前正在参与研发自动化编程.在代码解析.自动生成.以及源码分析过程中总会遇到一些算法的问题. 所以想着 ...
最新文章
- 连环清洁工之特殊任务--java资源如何关闭?
- Java工程师学习步骤
- 实现MySQL远程连接
- 程序设计课程技巧小总结
- android pss内存,如何释放android系统中pss cache住的内存
- 基于CFS算法的schedule()源码分析
- 美团技术:交易平台建设实践(视频+胶片)
- linux运维需要掌握的基础知识
- python-九九乘法打印
- ImageView的属性android:scaleType作用
- 启明星Zynq7010制作PYNQ V2.4镜像过程记录
- WAP PUSH解析(1)——SMS PDU编码
- 7天连锁酒店郑南雁:顺势创业者无为管理人
- windows环境搭建hadoop
- 迈达斯导出html计算书,动态计算书模块功能-midas Civil 2011
- 解决Ubuntu18.04搜狗输入法无法使用的问题
- php 如何移动文件,php怎样移动文件
- flink实战-实时计算平台通过api停止流任务
- ubuntu 解包和压包.img文件
- 深夜来一发,拿走不谢