基数排序c++实现
基数排序:是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。但在大部分的情况下还是在用在证书的情况下比较多。我这里也是只用了整数来实现。如果有负数,则可以用将负数序列反序的方法达到排序效果。如果是小数或字符串,那就将字符串拆下进行排序就可以了。
下面我来说说正整数用基数排序的原理:
假设有序列:23, 45, 21, 1, 321, 34, 0.我们要对其排序,首先将序列变成位数相同,位数不够的在前面补0,变成如下:
023
045
021
001
321
034
000
首先我们取最低位开始排,原因是 如果要从高位排序, 那么次高位的排序会影响高位已经排好的大小关系. 因为高位的排序结果对数的影响是比较大的。如20和13,高位排的结果是20>13,而低位排的结果是13>20.
排一次的结果:
00
02
00
32
02
03
04
排第二次的结果:
00
01
01
31
03
04
05
排第三次的结果:
00
01
21
23
34
45
21
于是就得到了一个有序数列0,1,21,23,34,45,321 。
还有一点要说明的是,这里我们在对各位进行排序的时候要选择稳定排序,就是不能改变位值相同的数之间的相对位置,因为高位相同的时候大小是由低位决定的。所以稳定排序可以不影响这些数的相对位置。这里我用的是计数排序。在上篇讲计数排序那里我就说过,计数排序最大用处可能也就在这了。因为位数都是0~9,计数排序又足够快。空间上也不会很大开销。
下面是我的程序实现:
#include <iostream>
#include <stdio.h>
#include <vector>
#include <cmath> using namespace std; void radixSort(int* arrayL, int digit, int len) {
int digitValue;
for (int i = ; i <= digit; i++) {
vector<int> digitValueList[]; for (int j = ; j != len; j++) {
//得到位值,相同位值得就加在后面,这样还是有序的。
digitValue = (arrayL[j] % (int)(pow(10.0, i)) - arrayL[j] %
(int)(pow(10.0, i - ))) / pow(10.0, i - );
digitValueList[digitValue].push_back(arrayL[j]);
}
//把所有的元素读进数组
int count = ;
for (int j = ; j != ; j++) {
for (int k = ; k != digitValueList[j].size(); k++) {
arrayL[count] = digitValueList[j][k];
count++;
}
}
}
} void output(int* arrayL, int len) {
for (int i = ; i != len; i++)
printf("%d ", arrayL[i]);
}
int main(int argc, char const *argv[])
{
int lenOfArray;
int *arrayL;
printf("Enter the len of the array: ");
scanf("%d", &lenOfArray);
arrayL = new int[lenOfArray];
printf("Enter the elemrnt of array to sort: ");
for (int i = ; i != lenOfArray; i++)
scanf("%d", &arrayL[i]);
int digit;
printf("Enter the len of biggest's digit: ");
scanf("%d", &digit);
radixSort(arrayL, digit, lenOfArray);
output(arrayL, lenOfArray); delete []arrayL;
return ;
}
基数排序c++实现的更多相关文章
- 算法与数据结构(十七) 基数排序(Swift 3.0版)
前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 排序算法----基数排序(RadixSort(L,max))单链表版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...
- 基本排序算法——基数排序java实现
基数排序 package basic.sort; import java.util.Arrays; import java.util.Random; public class RadixSort { ...
- 数据结构作业之用队列实现的基数排序(Java版)
题目: 利用队列实现对某一个数据序列的排序(采用基数排序),其中对数据序列的数据(第1和第2条进行说明)和队列的存储方式(第3条进行说明)有如下的要求: 1)当数据序列是整数类型的数据的时候,数据序列 ...
- 基数排序 java 实现
基数排序 java 实现 Wikipedia: Radix sort geeksforgeeks: Radix sort 数学之美番外篇:快排为什么那样快 Java排序算法总结(八):基数排序 排序八 ...
- 【UVA 11462】 Age Sort(基数排序)
题 题意 给你最多2000000个数据,大小是1到99的数,让你排序输出. 分析 快排也可以过.不过这题本意是要基数排序(桶排序),就是读入年龄age, a[age]++,然后输出时,从1到99岁(看 ...
- Hark的数据结构与算法练习之基数排序
算法说明 基数排序是基于计数排序的,所以看这个之前要先看一下计数排序对于理解基数排序是很有帮助的(发现计数和基数的音节几乎一致啊).这个我有写,请点击. OK,现在你肯定已经熟悉了计数排序,那么我就来 ...
- 归并排序 & 计数排序 & 基数排序 & 冒泡排序 & 选择排序 ----> 内部排序性能比较
2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...
随机推荐
- BZOJ 1293 生日礼物(尺取法)
把坐标离散化之后就是很普通的尺取法啦. # include <cstdio> # include <cstring> # include <cstdlib> # i ...
- Openstack keystone组件详解
OpenStack Keystone Keystone(OpenStack Identity Service)是 OpenStack 框架中负责管理身份验证.服务规则和服务令牌功能的模块.用户访问资源 ...
- 《转》vue-cli的webpack模板项目配置文件注释
一.文件结构 本文主要分析开发(dev)和构建(build)两个过程涉及到的文件,故下面文件结构仅列出相应的内容. ├─build │ ├─build.js │ ├─check-versions.js ...
- JS变量对象详解
JS变量对象详解 开年之后工作热情一直不是很高,这几天一直处于消极怠工状态.早上不想起床,起床了不想上班.明明放假之前工作热情还一直很高,一直心心念念的想把小程序项目怼出来,结果休假回来之后画风完全不 ...
- [BZOJ5339] [TJOI2018]教科书般的亵渎
题目链接 BZOJ题面. 洛谷题面. Solution 随便推一推,可以发现瓶颈在求\(\sum_{i=1}^n i^k\),关于这个可以看看拉格朗日插值法. 复杂度\(O(Tm^2)\). #inc ...
- [BZOJ4942] [NOI2017]整数
题目背景 在人类智慧的山巅,有着一台字长为1048576位(此数字与解题无关)的超级计算机,著名理论计算机科 学家P博士正用它进行各种研究.不幸的是,这天台风切断了电力系统,超级计算机 无法工作,而 ...
- HDU - 6333 Harvest of Apples
题意: T次询问,每次给出n,m.求sigma(k:0->m)C(n, k). 题解: 用离线莫队来做. 令S(n,m) = sigma(k:0->m)C(n, k). S(n+1, m) ...
- 函数strcpy的实现
strcpy函数的百科中给出了各种情况的详细说明,这里,仅给出一些注意事项: 1.strcpy的函数原型是: /* dest(destination)为目标字符串,src(source)为原字符串*/ ...
- postgresql pgagent 的安装及使用
pgagent 作为postgresql的一个任务调度代理,在postgresql 9.0 以前 是附带在pgadmin 包下面的,只是默认不安装,9.0之后作为了一个单独是的安装包.所以要使用pga ...
- JS判断内容为空方法总结
HTML代码: 用户名:<input type="text" id="username"> <p style="color:red& ...