oj 2758: C++习题-基数排序
来源:互联网 发布:学简单英语口语的软件 编辑:程序博客网 时间:2024/06/04 18:03
问题:
Description
基数排序是一种分配排序,其基本思想是:排序过程无须比较关键字,而是通过“分配”和“收集”过程来实现排序。它们的时间复杂度可达到线性O(n)。基数排序所做的事情,是对N位分别进行排序。从直觉上来看,人们可能会觉得应该首先按最高有效位进行排序,不过这点与我们的直觉相反,基数排序首先对最低有效位数字进行排序。如果我们每次比较r bits,则需要进行b/r趟,每趟进行计数排序需要O(n+2^r),则总的时间复杂度为O(b/r(n+2^r))。
理论上来说,基数排序的速度是几种排序方法中最快的,可以达到O(N),而其它的排序算法最快也只有O(N*logN)。但是,基数排序需要占用额外的空间,而且只支持整数进行排序。
#include <iostream>
#include <string.h>
using namespace std;
/* 获取输入数字的索引值,order指定需要获取哪一位的索引,1代表个位,2代表十位,3代表百位 */
int get_index(int num, int order)
{
while(--order)
num/=10;
return num%10;
}
/* 进行基数排序 */
void radix_sort(int arr[], int len, int dec, int order)
{
int i, j;
int index; /* 排序索引 */
int tmp[1001]; /* 临时数组,用来保存待排序的中间结果 */
int num[10]; /* 保存索引值的数组 */
memset(num, 0, 10*sizeof(int)); /* 数组初始清零 */
memset(tmp, 0, len*sizeof(int));/* 数组初始清零 */
if (dec < order) /* 最高位排序完成后返回 */
return;
for (i=0; i<len; i++)
{
index = get_index(arr[i],order); /* 获取索引值 */
num[index]++; /* 对应位加一 */
}
for (i=1; i<10; i++)
num[i] += num[i-1]; /* 调整索引数组 */
for (i=len-1; i>=0; i--)
{
index = get_index(arr[i], order);/* 从数组尾开始依次获得各个数字的索引 */
j = --num[index]; /* 根据索引计算该数字在按位排序之后在数组中的位置 */
tmp[j] = arr[i]; /* 数字放入临时数组 */
}
for (i=0; i<len; i++)
arr[i] = tmp[i]; /* 从临时数组复制到原数组 */
/////////////////////////////////////////////////////////
/* 这里补充代码 */
/* 继续按高一位的数字大小进行排序 */
/////////////////////////////////////////////////////////
return;
}
int main()
{
int i,n;
int arr[1001];
cin>>n;
for(i=0; i<n; i++)
cin>>arr[i];
int dec=3; /* 最多处理位数 */
int order= 1; /* 排序的位数,1代表个位、2代表十位、3代表百位 */
/* 排序函数,从个位开始 */
radix_sort(arr, n, dec, order);
for (i=0; i<n; i++)
cout<<arr[i]<<" ";
cout<<endl;
return 0;
}
#include <string.h>
using namespace std;
/* 获取输入数字的索引值,order指定需要获取哪一位的索引,1代表个位,2代表十位,3代表百位 */
int get_index(int num, int order)
{
while(--order)
num/=10;
return num%10;
}
/* 进行基数排序 */
void radix_sort(int arr[], int len, int dec, int order)
{
int i, j;
int index; /* 排序索引 */
int tmp[1001]; /* 临时数组,用来保存待排序的中间结果 */
int num[10]; /* 保存索引值的数组 */
memset(num, 0, 10*sizeof(int)); /* 数组初始清零 */
memset(tmp, 0, len*sizeof(int));/* 数组初始清零 */
if (dec < order) /* 最高位排序完成后返回 */
return;
for (i=0; i<len; i++)
{
index = get_index(arr[i],order); /* 获取索引值 */
num[index]++; /* 对应位加一 */
}
for (i=1; i<10; i++)
num[i] += num[i-1]; /* 调整索引数组 */
for (i=len-1; i>=0; i--)
{
index = get_index(arr[i], order);/* 从数组尾开始依次获得各个数字的索引 */
j = --num[index]; /* 根据索引计算该数字在按位排序之后在数组中的位置 */
tmp[j] = arr[i]; /* 数字放入临时数组 */
}
for (i=0; i<len; i++)
arr[i] = tmp[i]; /* 从临时数组复制到原数组 */
/////////////////////////////////////////////////////////
/* 这里补充代码 */
/* 继续按高一位的数字大小进行排序 */
/////////////////////////////////////////////////////////
return;
}
int main()
{
int i,n;
int arr[1001];
cin>>n;
for(i=0; i<n; i++)
cin>>arr[i];
int dec=3; /* 最多处理位数 */
int order= 1; /* 排序的位数,1代表个位、2代表十位、3代表百位 */
/* 排序函数,从个位开始 */
radix_sort(arr, n, dec, order);
for (i=0; i<n; i++)
cout<<arr[i]<<" ";
cout<<endl;
return 0;
}
Input
输入n和n个整数
Output
从小到大排序
Sample Input
102 1 3 4 6 5 7 9 8 10
Sample Output
1 2 3 4 5 6 7 8 9 10
HINT
Source
邵英帅&OJ
例如:待排序列:23,234,51,440,99,47,8,3,36,55
第一次排个位(加粗为桶子):
0 440
1 51
2
3 3 23
4 234
5 55
6 36
7 47
8 8
9 99
第二次排十位:
0 3 8
1
2 23
3 234 36
4 440 47
5 51 55
6
7
8
9 99
第三次排百位:
0 3 8 23 36 47 51 55 99
1
2 234 440
3
4
5
6
7
8
9
最后得到正确序列:3 8 23 36 47 51 55 99 234 440
可以看到,基数排序只支持整数排序......
此题代码:
#include <iostream>#include <string.h>using namespace std;/* 获取输入数字的索引值,order指定需要获取哪一位的索引,1代表个位,2代表十位,3代表百位 */int get_index(int num, int order){ while(--order) num/=10; return num%10;}/* 进行基数排序 */void radix_sort(int arr[], int len, int dec, int order){ int i, j; int index; /* 排序索引 */ int tmp[1001]; /* 临时数组,用来保存待排序的中间结果 */ int num[10]; /* 保存索引值的数组 */ memset(num, 0, 10*sizeof(int)); /* 数组初始清零 */ memset(tmp, 0, len*sizeof(int));/* 数组初始清零 */ if (dec < order) /* 最高位排序完成后返回 */ return; for (i=0; i<len; i++) { index = get_index(arr[i],order); /* 获取索引值 */ num[index]++; /* 对应位加一 */ } for (i=1; i<10; i++) num[i] += num[i-1]; /* 调整索引数组 */ for (i=len-1; i>=0; i--) { index = get_index(arr[i], order);/* 从数组尾开始依次获得各个数字的索引 */ j = --num[index]; /* 根据索引计算该数字在按位排序之后在数组中的位置 */ tmp[j] = arr[i]; /* 数字放入临时数组 */ } for (i=0; i<len; i++) arr[i] = tmp[i]; /* 从临时数组复制到原数组 */ radix_sort(arr, len, dec, order+1); /* 这里补充代码 */ /* 继续按高一位的数字大小进行排序 */ return;}int main(){ int i,n; int arr[1001]; cin>>n; for(i=0; i<n; i++) cin>>arr[i]; int dec=3; /* 最多处理位数 */ int order= 1; /* 排序的位数,1代表个位、2代表十位、3代表百位 */ /* 排序函数,从个位开始 */ radix_sort(arr, n, dec, order); for (i=0; i<n; i++) cout<<arr[i]<<" "; cout<<endl; return 0;}
小结:学习了排序中的基数排序。
阅读全文
0 0
- oj 2758: C++习题-基数排序
- OJ.2425: C语言习题 输出月份
- OJ.2426: C语言习题 字符串排序
- 基数排序(C#)
- c 基数排序
- 基数排序(c)
- YTU-OJ-Problem C: C++习题 抽象基类
- neuq oj 1051: 谭浩强C语言(第三版)习题6.7
- 第十五周 oj训练 C语言习题 字符串长度
- oj Problem D: C语言习题 输出月份
- oj 2968: C语言习题5.20--递归方法实现逆序
- NEUQ OJ 1039: 谭浩强C语言(第三版)习题4.9
- NEUQACM OJ:1072--谭浩强C语言(第三版)习题9.3
- NEUQACM OJ:1071谭浩强C语言(第三版)习题9.2
- NEUQACM OJ:1070 谭浩强C语言(第三版)习题9.1
- 算法导论 基数排序 习题8.3-4
- 基数排序 C语言数据结构
- 基数排序C语言实现
- IDEA Licence Server 激活
- C/C++_log2000_2017春季算法实验2_1
- python基础入门(三)
- 网站静态化处理—web前端优化—上(11)
- 超级淘推出“翻牌子”活动,为会员送百万福利
- oj 2758: C++习题-基数排序
- 【BZOJ】Network 最小生成树+LCA
- hibernate框架02
- 我在阿里云服务器上的 centos7 上 apache 安装https pem 证书的悲惨经历
- 今天项目用到了字符串处理,简单整理下几个常用
- 文件共享之nfs
- 网站静态化处理—web前端优化—中(12)
- py-faster-rcnn流程(6)——训练Fastrcnn网络二阶段
- Maven项目报错:java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config