基数排序思想和代码
2016-04-21 16:02
441 查看
把每个数映射为一个结构体,添加一个位数值的属性,然后从最低位到最高位按此位的值对这组数排序。排序可使用计数排序(因为待排值都分布在很小的区间内)
此代码已A过 POJ2388
#include <stdio.h>
#define LENGTH 1000001
#define MAXNUM 10
int a[LENGTH];
int count[MAXNUM];
struct{
int digit;//key
int num;
}digit_num[LENGTH];
struct{
int digit;
int num;
}result[LENGTH];
void print(int* a,int x,int y){
int i;
for (i = x; i < y+1; i++)
printf("%d ",a[i]);
printf("\n");
}
void counting_sort(int n){
int i;
for(i = 0 ; i < MAXNUM;i++)
count[i] = 0;
for(i = 0 ; i < n;i++)
count[digit_num[i].digit]++;
for(i = 1 ; i < MAXNUM;i++)
count[i] += count[i-1];
for(i = 0 ; i < MAXNUM;i++)
count[i] --;
for(i = n-1 ; i >= 0;i--){
result[count[digit_num[i].digit]].num = digit_num[i].num;
count[digit_num[i].digit]--;
}
for(i = 0; i < n; i++)
digit_num[i].num = result[i].num;
}
int get_num_at_digit(int num,int d){
int mul,i,m;
mul = 1;
for(i = 1;i <= d; i++)
mul*=10;
m = num%mul/(mul/10);
return m;
}
void radix_sort(n){
int i,d;
d = 0;
for(i = 0; i < n ; i++){
int dd,num;
dd = 1;
num = a[i];
digit_num[i].num = num;
while(num/10 > 0){
num /= 10;
dd ++;
}
d = d > dd ? d : dd;
}
int j;
for(j = 1; j <= d; j++){
for(i = 0; i < n; i++)
digit_num[i].digit = get_num_at_digit(digit_num[i].num,j);
counting_sort(n);
}
}
int main(){
int n,i;
freopen("sort.in","r",stdin);
scanf("%d",&n);
for(i = 0 ; i < n ; i++)
scanf("%d",&a[i]);
radix_sort(n);
for(i = 0 ; i < n;i++)
printf("%d ",digit_num[i].num);
printf("\n");
return 0;
}
此代码已A过 POJ2388
#include <stdio.h>
#define LENGTH 1000001
#define MAXNUM 10
int a[LENGTH];
int count[MAXNUM];
struct{
int digit;//key
int num;
}digit_num[LENGTH];
struct{
int digit;
int num;
}result[LENGTH];
void print(int* a,int x,int y){
int i;
for (i = x; i < y+1; i++)
printf("%d ",a[i]);
printf("\n");
}
void counting_sort(int n){
int i;
for(i = 0 ; i < MAXNUM;i++)
count[i] = 0;
for(i = 0 ; i < n;i++)
count[digit_num[i].digit]++;
for(i = 1 ; i < MAXNUM;i++)
count[i] += count[i-1];
for(i = 0 ; i < MAXNUM;i++)
count[i] --;
for(i = n-1 ; i >= 0;i--){
result[count[digit_num[i].digit]].num = digit_num[i].num;
count[digit_num[i].digit]--;
}
for(i = 0; i < n; i++)
digit_num[i].num = result[i].num;
}
int get_num_at_digit(int num,int d){
int mul,i,m;
mul = 1;
for(i = 1;i <= d; i++)
mul*=10;
m = num%mul/(mul/10);
return m;
}
void radix_sort(n){
int i,d;
d = 0;
for(i = 0; i < n ; i++){
int dd,num;
dd = 1;
num = a[i];
digit_num[i].num = num;
while(num/10 > 0){
num /= 10;
dd ++;
}
d = d > dd ? d : dd;
}
int j;
for(j = 1; j <= d; j++){
for(i = 0; i < n; i++)
digit_num[i].digit = get_num_at_digit(digit_num[i].num,j);
counting_sort(n);
}
}
int main(){
int n,i;
freopen("sort.in","r",stdin);
scanf("%d",&n);
for(i = 0 ; i < n ; i++)
scanf("%d",&a[i]);
radix_sort(n);
for(i = 0 ; i < n;i++)
printf("%d ",digit_num[i].num);
printf("\n");
return 0;
}
相关文章推荐
- 【小笨鸟看JDK1.7集合源码之三】LinkedList源码剖析
- 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法
- 理解C语言的数组和指针
- 理解C语言的数组和指针
- matlab计时
- matlab计时
- 二叉树的遍历 Java版
- QT Creator Beautifying Source Code with Artistic Style
- Python下进程与线程的原理及区别
- C++之输入(cin)详解
- java LinkedList实现原理概述
- Struts2 Result详解
- 【积累】C/C++中明明该用函数实现的功能,为啥非要自己写代码!
- C#界面设计之文本阅读器的设计
- C# 协变和逆变
- Django笔记 Django REST Framework实现Web API 1
- Java 哈希机制
- Mac装matlab2015b步骤
- JAVA泛型编程笔记
- JavaI/O系统