基数排序(RadixSort)
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)的更多相关文章
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 排序算法----基数排序(RadixSort(L,max))单链表版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 模板化的七种排序算法,适用于T* vector<T>以及list<T>
最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...
- 6种基础排序算法java源码+图文解析[面试宝典]
一.概述 作为一个合格的程序员,算法是必备技能,特此总结6大基础算法.java版强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步:1.思想2.图 ...
- 20172328 2018-2019《Java软件结构与数据结构》第五周学习总结
20172328 2018-2019<Java软件结构与数据结构>第五周学习总结 概述 Generalization 本周学习了第九章:排序与查找,主要包括线性查找和二分查找算法和几种排序 ...
- Java排序算法总结(转载)
排序算法 平均时间复杂度 冒泡排序 O(n2) 选择排序 O(n2) 插入排序 O(n2) 希尔排序 O(n1.5) 快速排序 O(N*logN) 归并排序 O(N*logN) 堆排序 O(N*log ...
- C语言实现排序
//C语言版排序#include<stdio.h> #include<stdlib.h> //冒泡排序 void bubleSort(int data[], int n); / ...
- 十大基础排序算法[java源码+动静双图解析+性能分析]
一.概述 作为一个合格的程序员,算法是必备技能,特此总结十大基础排序算法.java版源码实现,强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步: ...
- 浅谈后缀数组SA
这篇博客不打算讲多么详细,网上关于后缀数组的blog比我讲的好多了,这一篇博客我是为自己加深印象写的. 给你们分享了那么多,容我自私一回吧~ 参考资料:这位dalao的blog 一.关于求Suffix ...
随机推荐
- confirm使用方法
定义和使用方法 confirm() 方法用于显示一个带有指定消息和 OK 及取消button的对话框. 语法 confirm(message) 參数 描写叙述 message 要在 window 上弹 ...
- spring mvc 框架核心文档
http://docs.spring.io/spring-data/ Parent Directory - cassandra/ 01-Apr-2014 01:50 - commons/ 29-Jan ...
- day06 Java基础
1.二维数组格式一(列固定):数据类型[][] 变量名=new 数据类型[m][n]; 二维数组格式二(列变化):数据类型[][] 变量名=new 数据类型[m][]; 二维数组格式三:数据类型[][ ...
- C#_判断2个对象的值是否相等
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 由c#的值类型与引用类型说开去
之前一直被灌输,C#分值类型和引用类型,在程序运行时,它们分别存在栈(Stack) 和堆(Heap)上.这也是面试经典问题了,但其实其中存在很大的误解.比如某个实例对象中有一个Int型成员.当这个实例 ...
- Android自定义View,高仿QQ音乐歌词滚动控件!
最近在以QQ音乐为样板做一个手机音乐播放器,源码下篇博文放出.今天我想聊的是这个QQ音乐播放器中歌词显示控件的问题,和小伙伴们一起来探讨怎么实现这个歌词滚动的效果.OK,废话不多说,先来看看效果图: ...
- Android 高级UI设计笔记03:使用ListView实现左右滑动删除Item
1. 这里就是实现一个很简单的功能,使用ListView实现左右滑动删除Item: (1)当我们在ListView的某个Item,向左滑动显示一个删除按钮,用户点击按钮,即可以删除该项item,并且有 ...
- 关于Eclipse(MyEclipse)中一次性批量导入多个项目Project.
以前更换Eclipse(MyEclipse)的时候要想把原Eclipse中的项目导入到新的Eclipse中的做法是: 1.先把原Eclipse中工作空间中的项目(不包括.metadata文件夹)复制到 ...
- Wince 设备环境和画笔应用
本文主要讲到的是画笔应用,在Wince -06环境下,画笔应用很广泛,很有技巧,这里笔者要着重介绍. 设备环境可以用一下图表示,主要是让大家大致了解Wince -06的设备环境,下面在图形舍虚设计中会 ...
- 自动化中的PageObject思想
谈着这个话题很大,因为我自己在自动化分层的方面做的就不是很好,最近在做java+selenium中,如果不分层去管理,代码就显得很乱,如下: 下面代码主要是做了一个登录,登录后在修改自己的一些个人信息 ...