基数排序是另外一种比较有特色的排序方式,它是怎么排序的呢?我们可以按照下面的一组数字做出说明:12、 104、 13、 7、 9

(1)按个位数排序是12、13、104、7、9

(2)再根据十位排序104、7、9、12、13

(3)再根据百位排序7、9、12、13、104

这里注意,如果在某一位的数字相同,那么排序结果要根据上一轮的数组确定,举个例子来说:07和09在十分位都是0,但是上一轮排序的时候09是排在07后面的;同样举一个例子,12和13在十分位都是1,但是由于上一轮12是排在13前面,所以在十分位排序的时候,12也要排在13前面。

所以,一般来说,10基数排序的算法应该是这样的?

(1)判断数据在各位的大小,排列数据;

(2)根据1的结果,判断数据在十分位的大小,排列数据。如果数据在这个位置的余数相同,那么数据之间的顺序根据上一轮的排列顺序确定;

(3)依次类推,继续判断数据在百分位、千分位......上面的数据重新排序,直到所有的数据在某一分位上数据都为0。

说了这么多,写上我们的代码。也希望大家自己可以试一试。

a)计算在某一分位上的数据

int pre_process_data(int array[], int length, int weight)
{
int index ;
int value = 1; for(index = 0; index < weight; index++)
value *= 10; for(index = 0; index < length; index ++)
array[index] = array[index] % value /(value /10); for(index = 0; index < length; index ++)
if(0 != array[index])
return 1; return 0;
}

b)对某一分位上的数据按照0~10排序

void sort_for_basic_number(int array[], int length, int swap[])
{
int index;
int basic;
int total = 0; for(basic = -9; basic < 10; basic++){
for(index = 0; index < length; index++){
if(-10 != array[index] && basic == array[index] ){
swap[total ++] = array[index];
array[index] = -10;
}
}
} memmove(array, swap, sizeof(int) * length);
}

c)根据b中的排序结果,对实际的数据进行排序

void sort_data_by_basic_number(int array[], int data[], int swap[], int length, int weight)
{
int index ;
int outer;
int inner;
int value = 1; for(index = 0; index < weight; index++)
value *= 10; for(outer = 0; outer < length; outer++){
for(inner = 0; inner < length; inner++){
if(-10 != array[inner] && data[outer]==(array[inner] % value /(value/10))){
swap[outer] = array[inner];
array[inner] = -10;
break;
}
}
} memmove(array, swap, sizeof(int) * length);
return;
}

d)把a、b、c组合起来构成基数排序,直到某一分位上的数据为0

void radix_sort(int array[], int length)
{
int* pData;
int weight = 1;
int count;
int* swap;
if(NULL == array || 0 == length)
return; pData = (int*)malloc(sizeof(int) * length);
assert(NULL != pData);
memmove(pData, array, length * sizeof(int)); swap = (int*)malloc(sizeof(int) * length);
assert(NULL != swap); while(1){
count = pre_process_data(pData, length, weight);
if(!count)
break; sort_for_basic_number(pData, length, swap);
sort_data_by_basic_number(array, pData, swap, length, weight);
memmove(pData, array, length * sizeof(int));
weight ++;
} free(pData);
free(swap);
return;
}

总结:

(1)测试的时候注意负数的情形

(2)如果在某一位数据相同,那么需要考虑上一轮数据排序的情况

(3)代码中多次分配小空间,此处代码待优化

补充:

(1) 10月15日晚上修改了余数取值范围,这样负数也可以参加排序

(2)10月16日上午增加了一个swap内存分配,避免了内存的重复分配和释放

(3)10月16日上午删除了count计数,一旦发现有不等于0的数据直接返回为1,不需要全部遍历数据

c++(基数排序)的更多相关文章

  1. 算法与数据结构(十七) 基数排序(Swift 3.0版)

    前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...

  2. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  3. 排序算法----基数排序(RadixSort(L,max))单链表版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  4. 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)

    如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...

  5. 基本排序算法——基数排序java实现

    基数排序 package basic.sort; import java.util.Arrays; import java.util.Random; public class RadixSort { ...

  6. 数据结构作业之用队列实现的基数排序(Java版)

    题目: 利用队列实现对某一个数据序列的排序(采用基数排序),其中对数据序列的数据(第1和第2条进行说明)和队列的存储方式(第3条进行说明)有如下的要求: 1)当数据序列是整数类型的数据的时候,数据序列 ...

  7. 基数排序 java 实现

    基数排序 java 实现 Wikipedia: Radix sort geeksforgeeks: Radix sort 数学之美番外篇:快排为什么那样快 Java排序算法总结(八):基数排序 排序八 ...

  8. 【UVA 11462】 Age Sort(基数排序)

    题 题意 给你最多2000000个数据,大小是1到99的数,让你排序输出. 分析 快排也可以过.不过这题本意是要基数排序(桶排序),就是读入年龄age, a[age]++,然后输出时,从1到99岁(看 ...

  9. Hark的数据结构与算法练习之基数排序

    算法说明 基数排序是基于计数排序的,所以看这个之前要先看一下计数排序对于理解基数排序是很有帮助的(发现计数和基数的音节几乎一致啊).这个我有写,请点击. OK,现在你肯定已经熟悉了计数排序,那么我就来 ...

  10. 归并排序 & 计数排序 & 基数排序 & 冒泡排序 & 选择排序 ----> 内部排序性能比较

    2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...

随机推荐

  1. 解决报错:IncompleteElementException: Could not find result map...

    今天遇到这样一个报错,记录一下: org.apache.ibatis.builder.IncompleteElementException: Could not find result map com ...

  2. Who Will Win?

    Gautam and Subhash are two brothers. They are similar to each other in all respects except one. They ...

  3. TxDragon的训练5

    Solution 代码:由乃: //MADE BY QT666 #include<iostream> #include<cstdio> #include<algorith ...

  4. 3.Nginx常用功能介绍

    Nginx常用功能介绍 Nginx反向代理应用实例 反向代理(Reverse Proxy)方式是指通过代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并且从内部网络服 ...

  5. java之自动过滤提交文本中的html代码script代码

    public class test { public static String Html2Text(String inputString) { String htmlStr = inputStrin ...

  6. BeanShell Sample与控制台交互

    应用的场景:业务当中涉及到一些敏感信息,如验证码,银行卡密码等或是动态变化的,不能直接写在脚本中,就需要通过控制台手动输入 如密码已键盘的方式输入,在控制台中以密码的方式显示 处理方法:添加 bean ...

  7. Webpack 2 视频教程 013 - 自动分离 CSS 到独立文件

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  8. 笔记-NSArray 逆序reverseObjectEnumerator 及 NSEnumerator 遍历

    //1.原始数组 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1",@"2",@&qu ...

  9. 编写OC高质量的代码的有效方法

    1. 写这个只是为了自己记忆,有相关pdf文件,如需要留下邮箱.. 2. 在类的头文件中尽量少引入其他头文件 除非确有必要,否则不要引入头文件.一般来说,应在某个类的头文件中使用向前声明来提及别的类( ...

  10. 如何处理Cookie存储和读取中文乱码问题

    存储Cookie for(String str:books){ str=new String(str.getBytes("ISO-8859-1"),"utf-8" ...