1 基数排序的特点是研究多个关键字key,且多个key之间有权重之分,

   或者可把单个key建模为含有多个key的排序

而计数排序、桶排序始终只有个一个key,或者说围绕着一个比较规则

Ex:比较年月日,先比较年份,如果相同,比较月份,如果还是相同,就比较日

2 根据首先选择有效位的不同,分为两种

A. 先比较最高有效位,然后在比较次高位的有效位,以此类推进行比较MSD(Most Significant Dight)

     假如有189,321,312,167 需要考虑高有效位相同的情况与不同的情况

最高位不同:直接分出大小,并且需要记住312与321 > 比189,167大

最高位相同:比较十位,并且根据上述记录只比较312与321之间的十位数,否则排序是不稳定的

B. 先比较最低有效位,然后在比较次低位的有效位,以此类推进行比较LSD(Least Significant Dight)

无需考虑MSD排序遇到的问题,直接对每个位数排序即可

注意:每次排序只针对当前位数(辅助排序函数必须是基于稳定的)

3 可以使用基数排序对一些位数有限的十进制数排序(十进制整数每位固定大小0~9)

4 基数排序时间代价 O(d(n+k))(前提是辅助函数为计数排序的情况下)

d为关键值key的位数的个数,每位排序执行计数排序需要O(n+k)

 #include <iostream>
#include <crtdbg.h>
#include <cstring>
using namespace std; const int SIZE = ; //n的大小
const int K = ; //允许的最大整数
enum numberBit
{
GeWei = ,
ShiWei = ,
BaiWei = ,
QianWei = ,
};
//获取当前位数,d表示位数
int GetData(const int data, int d)
{
int tmp = ;
switch(d)
{
case GeWei:
{
tmp = data%;
}
break;
case ShiWei:
{
tmp = data%;
tmp = tmp/;
}
break;
case BaiWei:
{
tmp = data%;
tmp = tmp/;
}
break;
case QianWei:
{
tmp = data/; //允许最大值为1000
}
break;
default:
{
cout <<"wrong number, which big then k";
return -;
}
break;
}
return tmp;
}
//计数排序, d为当前位数
void CountingSort(int array[], int size, int d)
{
//建立辅助数组pCount大小固定为10(0~9),用来存储统计的元素信息
int *pCount = new int[];
memset(pCount, , ()*sizeof(pCount[])); //建立辅助数组result存储结果
int *result = new int[size];
memset(result, , size*sizeof(result[])); //数组p使用元素大小做为下标,统计array的每个元素的个数
for(int i=; i<; ++i)
{
int position = GetData(array[i], d); //获取元素的位置
pCount[position] = pCount[position] + ;
} //数组p 记录每个元素x在数组array中 小于或等于x的个数
//比如个位数时:小于等于4 的为元素 为3个(0, 1000, 83)
for (int i=; i<=; ++i)
{
pCount[i] = pCount[i]+pCount[i-];
} //根据上述获取的信息,进行排序
//比如个位数时:小于等于4的为元素为3个(0, 1000, 83),4的位置为第4个
for (int i=size-; i>=; --i)//此处为保证稳定性,从size-1 向 0 迭代
{
int data = GetData(array[i], d);
int position = pCount[data]; //获取数组array[i]的位置
result[position-] = array[i]; //放到正确的位置
pCount[data]= pCount[data] - ; //更新该元素的个数
}
//把结果存储到最初的数组array
for (int i=; i<size; ++i)
{
array[i] = result[i];
}
delete [] pCount;
delete [] result;
}
//基数排序,k为允许的最大整数
void RadixSort(int array[], int size, int k)
{
//选择稳定排序即可,计数排序或者桶排序(桶排序具体实现请转到上一节)
for (int i=; i<=k; i=i*) //i表示位数,从低有效位到高有效位 LSD
{
CountingSort(array, size, i); //计数排序
}
}
void main()
{
//检测是否有内存泄露 需要加头文件#include <crtdbg.h>
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); int array[SIZE] = {, , , , , , , , , ,}; RadixSort(array, SIZE, K); for (int i=; i<SIZE; ++i)
{
cout << array[i] << endl;
} system("pause");
}

(转载请注明作者和出处^_*  Seven++ http://www.cnblogs.com/sevenPP/  )

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

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

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

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

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

  3. 模板化的七种排序算法,适用于T* vector<T>以及list<T>

    最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...

  4. 6种基础排序算法java源码+图文解析[面试宝典]

    一.概述 作为一个合格的程序员,算法是必备技能,特此总结6大基础算法.java版强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步:1.思想2.图 ...

  5. 20172328 2018-2019《Java软件结构与数据结构》第五周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第五周学习总结 概述 Generalization 本周学习了第九章:排序与查找,主要包括线性查找和二分查找算法和几种排序 ...

  6. Java排序算法总结(转载)

    排序算法 平均时间复杂度 冒泡排序 O(n2) 选择排序 O(n2) 插入排序 O(n2) 希尔排序 O(n1.5) 快速排序 O(N*logN) 归并排序 O(N*logN) 堆排序 O(N*log ...

  7. C语言实现排序

    //C语言版排序#include<stdio.h> #include<stdlib.h> //冒泡排序 void bubleSort(int data[], int n); / ...

  8. 十大基础排序算法[java源码+动静双图解析+性能分析]

    一.概述 作为一个合格的程序员,算法是必备技能,特此总结十大基础排序算法.java版源码实现,强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步: ...

  9. 浅谈后缀数组SA

    这篇博客不打算讲多么详细,网上关于后缀数组的blog比我讲的好多了,这一篇博客我是为自己加深印象写的. 给你们分享了那么多,容我自私一回吧~ 参考资料:这位dalao的blog 一.关于求Suffix ...

随机推荐

  1. Select模型原理

    Select模型原理 利用select函数,推断套接字上是否存在数据,或者是否能向一个套接字写入数据.目的是防止应用程序在套接字处于锁定模式时,调用recv(或send)从没有数据的套接字上接收数据, ...

  2. apache vhost 访问权限配置

    apache的<directory>     </directory>语句,查考如下: 如何访问根目录下的目录http://192.168.1.12/test/ 第一.缺省ap ...

  3. 纯JS操作服务器绑定控件(Repeat)实现表头升降排序

    JS实现功能 var obj = function (id) { return "string" == typeof id ? document.getElementById(id ...

  4. android开发之路13(实际开发常见问题及解决办法ING)

    1.DDMS下无法浏览SDcard? 在做音乐播放器的时候,想通过eclipse中的DDMS视图将音频文件push到sd卡中,发现总是报错 :Failed to push selection: Rea ...

  5. oracle 自增列设置

    序列 create sequence sq_1 minvalue maxvalue start increment cache ; 触发器 create or replace trigger 触发器名 ...

  6. javaweb学习总结二十(http响应)

    一:http响应 1:http响应的组成部分 状态行.响应头.空行.响应数据 2:状态行 常用状态码: 200:请求成功 302:请求路径已经转移,请访问别的地址 307或者304: 请访问缓存信息 ...

  7. CF A and B and Compilation Errors (排序)

    A and B and Compilation Errors time limit per test 2 seconds memory limit per test 256 megabytes inp ...

  8. vb中的null.nothing.empty区别

    以下内容源自互联网: 变量 A.B.C.D 分别等于 0."".Null. Empty. Nothing 的哪一个? Dim A Dim B As String Dim C As ...

  9. hdu 4619 最大匹配问题

    思路:把所有涉及到的点按(x+y)的奇偶分成两部分点,对所有的1*2的骨牌,都有(x+y)为偶数的建到奇数的边.求一次最大匹配,就是答案. #include<iostream> #incl ...

  10. 2013 南京理工大学邀请赛B题

    思路: 每次枚举删除一个点,然后对剩下的点求出关键点,判断删除哪个关键点获得的连通分支数最大. #include<iostream> #include<cstdio> #inc ...