【sort】 基数排序
下面这段问答摘自csdn:
把基数排序说成桶排序应该是没有太大问题的。
总的说来,应该把这一类归为分配排序,由于分配排序的一些缺陷,主要是时间代价很差,改进成为桶式排序(bucket sort),而桶排序的基本思路是将较少的纪录分配到每个桶,然后用较快的“收尾排序”来对每桶中的纪录进行排序。在此基础上,当允许基于分配排序的收尾排序时,为了尽量减少桶的数量并缩短排序时间,发展出了基数排序(Radix Sort)。
基数的选择:如果是数字,最常用的是2和10这两个了,当然是由于二进制和十进制的关系,就如楼上的那种表示方法:8 = 0 * 2 ^ 1 + 0 * 2 ^ 2 + 1 * 2 ^ 3
同样,有:162 = 2 * 10 ^ 0 + 6 * 10 ^ 1 + 1 * 10 ^ 2
还记得基数、基码、位权吧,基数决定桶数,基码决定了桶的位置先后,位权决定分配次数。
如果是字符串,当然是26了(26个字母),呵呵。
至于“在位内进行比较的时候采用什么排序法???”
猜想意思是:把高位比较了一次之后,分到了不同的桶里,在桶内再将所有的数作一次排序。如果是那样的话,就只能叫桶排序了,就不能体现出基数排序的优越性。
在具体实现时,基数排序应该是没有比较大小这一过程的,而只是将待排序的数字什么的做分配的一个过程,只要看位权就可以决定到底做几次分配了(3位数就做3次分配)。
下面是一个例子:
待排序列表:27 91 1 97 17 23 84 28 72 5 67 25
基数是10,基码是0~9,最大的位权是1(决定了分配次数是1+1=2)。
第一趟分配:(先排个位数)
桶的编号 分配到桶内的数字
0
1 -> 91 -> 1
2 -> 72
3 -> 23
4 -> 84
5 -> 5 -> 25
6
7 -> 27 -> 97 -> 17 -> 67
8 -> 28
9
第一趟分配结果是(从0号桶开始,得到这个序列):91 1 72 23 84 5 25 27 97 17 67 28
然后在此基础上作第二次分配:(排十位数)
桶的编号 分配到桶内的数字
0 -> 1 -> 5
1 -> 17
2 -> 23 -> 25 -> 27 -> 28
3
4
5
6 -> 67
7 -> 72
8 -> 84
9 -> 91 -> 97
第二趟分配的结果是(从0号桶开始,得到这个序列):1 5 17 23 25 27 28 67 72 84 91 97
好了,这就是我们所需要的了。由于第一次的结果已经使个位数保持递增,第二次只要在此基础上使十位数递增即可,不用考虑个位数的大小,这样两次分配就可以达到排序目的了。
#include <cstdio>
#include <iostream>
#include <stdlib.h>
using namespace std;
int RadixCountSort(int*index, int maxn, int* nData, int len)
{
int* cnt= (int*)malloc(sizeof(int)* maxn);
;i<len;i++)
{
cnt[i] = ;
}
;i<len;i++)
{
cnt[index[i]]++;
}
;i<;i++) //确定不大于该位置的个数。
{
cnt[i]+=cnt[i-];
}
int *tmp=(int*)malloc(sizeof(int)*len); //存放临时的排序结果。
;i>=;i--)
{
cnt[index[i]]--;
tmp[cnt[index[i]]] = nData[i];
}
;i<len;i++)
{
nData[i] = tmp[i];
}
free(tmp);
free(cnt);
;
}
int RadixSort(int* nData,int len)
{
int *Radix=(int*)malloc(sizeof(int)*len);
;
bool check = false;
while (!check)
{
check = true;
Base *= ;
;i<len;i++)
{
Radix[i] = nData[i] % Base;
Radix[i] /= Base / ;
) check=false;
}
if (check)break; //如果所有的基数都为0,认为排序完成,就是已经判断到最高位了。
RadixCountSort(Radix, , nData, len);
}
free(Radix);
;
}
int main()
{
]={,,,,,,,,,};
RadixSort(Data, );
;i<;i++) printf("%d ",Data[i]);
printf("\n");
system("pause");
;
}
【sort】 基数排序的更多相关文章
- 【Udacity并行计算课程笔记】- Lesson 4 Fundamental GPU Algorithms (Applications of Sort and Scan)
I. Scan应用--Compact 在介绍这节之前,首先给定一个情景方便理解,就是因为某种原因我们需要从扑克牌中选出方块的牌. 更formal一点的说法如下,输入是 \(s_0,s_1,...\), ...
- 排序Tip
排序算法 所有排序算法汇总:http://en.wikipedia.org/wiki/Sort_algorithm counting sort 资料 :http://www.cs.miami.ed ...
- 【DS】排序算法的稳定性
主要的排序算法有八种:直接插入排序,希尔排序(这两种统称为插入排序),冒泡排序,快速排序(这两种统称为交换排序),直接选择排序,堆排序(这两种统称为选择排序),归并排序,基数排序.今天我们就讨论一下它 ...
- 《数据结构》《C++程序设计》《计算机组成原理》中的英语名词
一.数据结构 data 数据data element 数据元素data item 数据项data object 数据对象data structure 数据结构ADT (Abstruct Date Ty ...
- 分布排序(distribution sorts)算法大串讲
ref : https://dsqiu.iteye.com/blog/1707383 本文内容框架: §1 鸽巢排序(Pigeonhole) §2 桶排序(Bucket Sort) §3 基数 ...
- 常见排序算法总结与分析之交换排序与插入排序-C#实现
前言 每每遇到关于排序算法的问题总是不能很好的解决,对一些概念,思想以及具体实现的认识也是模棱两可.归根结底,还是掌握不够熟练.以前只是看别人写,看了就忘.现在打算自己写,写些自己的东西,做个总结.本 ...
- AlgorithmMan,一套免费的算法演示神器
概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/971 访问. 文章末尾附带GitHub开源下载地址. 0.概述 ...
- 十大经典排序算法最强总结(含Java、Python码实现)
引言 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法.排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面 ...
- Big O Complexity Graph
Big O Complexity Graph Big O === O() 算法复杂度速查表 数据结构 数组排序算法 Quicksort O(n log(n)) O(n log(n)) O(n^2) O ...
- 经典排序算法 - 基数排序Radix sort
经典排序算法 - 基数排序Radix sort 原理类似桶排序,这里总是须要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,临时忽视十位数 比如 待排序数组[ ...
随机推荐
- Sass与Compress实战:第八章
概要:帮助你实现样式表的最佳性能 本章内容: ● 样式表拼接 ● 样式表和资源压缩 ● 减少和并行图片请求的策略 ● 选择器性能和优化策略 1. 测量客户端性能 性能优化的起点和终点都是测量.在第一次 ...
- react中文API解读二(教程)
记下自己的react学习之路 ,官方文档写的很详尽,学起来应该比较简单 官方文档地址:react.http://reactjs.cn/react/docs/getting-started.html 2 ...
- WiMAX协议栈
1.协议栈模型 协议栈模型将 WiMAX 系统分为数据控制平面和管理平面两个平面 数据控制平面对数据的正确传输进行保证,包括封装.分片.加密.解封装等 基站与用户站之间的特定信令交互完成系统的控制功能 ...
- Implementing a builder: Combine
原文地址:点击这里 本篇我们继续讨论从一个使用Combine方法的computation expression中返回多值. 前面的故事 到现在为止,我们的表达式建造(builder)类如下 type ...
- Arch声卡配置
ALSA Utilities Install the alsa-utils package. This contains (among other utilities) the alsamixer a ...
- BcdTool(系统启动菜单管理器) v1.0912 绿色版
软件名称: 系统启动菜单管理器(BcdTool)软件语言: 简体中文授权方式: 免费软件运行环境: Win 32位/64位软件大小: 903KB图片预览: 软件简介:BcdTool是一款windows ...
- 2015 ACM/ICPC Asia Regional Shenyang Online
1001 Traversal 1002 Best Solver 1003 Minimum Cut 类似于POJ 3417的做法. 考虑每条新边对树边的覆盖次数. 每条树边被覆盖的次数其实就是断裂这条树 ...
- Matlab中矩阵的平方和矩阵中每个元素的平方介绍
该文章讲述了Matlab中矩阵的平方和矩阵中每个元素的平方介绍. 设t = [2 4 2 4] 则>> t.^2 ans = 4 164 16 而>> t^2 ans = ...
- Linux下gcc编译生成动态链接库*.so文件并调用它【转载】
动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一 ...
- vb6加载时提示出错,窗体log文件中错误信息为:控件 XX 的类 MSComctlLib.ListView 不是一个已加载的控件类。
解决办法:单击[工程] -- [部件] 添加此Microsoft Windows Common Controls-6.0 (SP6)部件,如果列表中没有,浏览到~\project\包\Support中 ...