基数排序(radix sort)

 1 #include<iostream>
 2 #include<ctime>
 3 #include <stdio.h>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include <map>
 7 #include <string>
 8 using namespace std;
 9 // A utility function to get maximum value in arr[]
10 int getMax(int arr[], int n)
11 {
12     int mx = arr[0];
13     for (int i = 1; i < n; i++)
14         if (arr[i] > mx)
15             mx = arr[i];
16     return mx;
17 }
18
19 // A function to do counting sort of arr[] according to
20 // the digit represented by exp.
21 void countSort(int arr[], int n, int exp)
22 {
23     int output[n]; // output array
24     int i, count[10] = {0};
25
26     // Store count of occurrences in count[]
27     for (i = 0; i < n; i++)
28         count[ (arr[i]/exp)%10 ]++;
29
30     // Change count[i] so that count[i] now contains actual position of
31     // this digit in output[]
32     for (i = 1; i < 10; i++)
33         count[i] += count[i-1];
34
35     // Build the output array
36     for (int i = n-1; i >= 0; i--) {
37         output[count[(arr[i]/exp)%10]-1] = arr[i];
38         count[(arr[i]/exp)%10]--;
39     }
40
41     // Copy the output array to arr[], so that arr[] now
42     // contains sorted numbers according to curent digit
43     for (i = 0; i < n; i++)
44         arr[i] = output[i];
45 }
46
47 // The main function to that sorts arr[] of size n using Radix Sort
48 void radixsort(int arr[], int n)
49 {
50     // Find the maximum number to know number of digits
51     int m = getMax(arr, n);
52
53     // Do counting sort for every digit. Note that instead of passing digit
54     // number, exp is passed. exp is 10^i where i is current digit number
55     for (int exp = 1; m/exp > 0; exp *= 10)
56         countSort(arr, n, exp);
57 }
58
59 // A utility function to print an array
60 void print(int arr[], int n)
61 {
62     for (int i = 0; i < n; i++)
63         cout << arr[i] << " ";
64 }
65 #if TEST
66 int main(){
67     int arr[] = {170, 45, 75, 90, 802, 24, 2, 66};
68         int n = sizeof(arr)/sizeof(arr[0]);
69         radixsort(arr, n);
70         print(arr, n);
71 }
72 #endif

时间: 2024-11-09 20:20:43

基数排序(radix sort)的相关文章

经典排序算法 - 基数排序Radix sort

经典排序算法 - 基数排序Radix sort 原理类似桶排序,这里总是需要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,暂时忽视十位数 例如 待排序数组[62,14,59,88,16]简单点五个数字 分配10个桶,桶编号为0-9,以个位数数字为桶编号依次入桶,变成下边这样 |  0  |  0  | 62 |  0  | 14 |  0  | 16 |  0  |  88 | 59 | |  0  |  1  |  2  |  3  |  4 | 

算法学习-基数排序(radix sort)卡片排序(card sort) C++数组实现

基数排序又叫卡片排序,这是在比较早的时候用的比较多的排序方法. 在现代计算机出现之前,一直用于老式穿孔卡的排序. 说下基数排序的思想,前面我有写一个桶式排序,基数排序的思想是桶式排序的推广. 桶式排序:http://blog.csdn.net/alps1992/article/details/38132593 基数排序的思想是在于只有10个桶,而不是最大数是多少就有多少个桶.假如我们有10个乱序的数字. 第一趟排序之后 0 1 512 343 64 125 216 27 8 729 0 1 2

桶排序/基数排序(Radix Sort)

说基数排序之前,我们先说桶排序: 基本思想:是将阵列分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序).桶排序是鸽巢排序的一种归纳结果.当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n)).但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响.          简单来说,就是把数据分组,放在一个个的桶中,然后对每个桶里面的在进行排序. 例如要对大小为[1..1000]范围内的n个整数A[1..n]排序 首

排序算法七:基数排序(Radix sort)

上一篇提到了计数排序,它在输入序列元素的取值范围较小时,表现不俗.但是,现实生活中不总是满足这个条件,比如最大整形数据可以达到231-1,这样就存在2个问题: 1)因为m的值很大,不再满足m=O(n),计数排序的时间复杂也就不再是线性的: 2)当m很大时,为计数数组申请的内存空间会很大: 为解决这两个问题,本篇讨论基数排序(Radix sort),基数排列的思想是: 1)将先按照某个基数将输入序列的每个元素划分成若干部分,每个部分对排序结果的影响是有优先级的: 2)先按低优先级排序,再按高优先级

【算法导论学习-015】基数排序(Radix sort)

1.<算法导论>P197页 8.3节Radix sort 2.java实现 这里仅仅对[算法导论学习-014]计数排序 的参数进行了修改,同时仅仅修改了一行代码. /** * 创建时间:2014年8月17日 下午4:05:48 * 项目名称:Test * @author Cao Yanfeng * @since JDK 1.6.0_21 * 类说明: 利用计数排序实现基数排序 * 条件:待排序的所有数位数相同,注意,即便不相同,也可以认为是最多那个位数,如下面的例子可以认为都是3位数 */ p

算法-基数排序(radix sort)

本文由@呆代待殆原创,转载请注明出处. 简介:这个排序是原来用在卡片排序机上的一个算法,一般用来比较具有多对关键字域的记录,如日期(年月日),通过基数排序我们会依次对年月日这三个关键字进行排序,只要对每个关键字进行排序的算法是稳定的,那么最后输出的序列就一定是正确的. 思路:基数排序思路很简单,首先取第一个关键字,然后对其进行排序,在第一次排序的基础上取第二个关键字,再对其进行排序,直到遍历完所有的关键字,一般用计数排序实现基数排序. 算法分析 时间复杂度:Θ(i*x)  i 是关键码的数量,x

Radix Sort

1. When we are sorting the numbers we will first find the number of digits in the biggest number. 2. If there are N digits in the biggest number then we will need to perform N number of pass. 3. We will pad the remaining numbers with leading zeros so

桶式排序和基数排序

之前总结了基于比较模型的常见排序算法,它们中最快的也要消耗O(nlogn)时间.但是我们应该知道的是,在一定条件下以线性时间进行排序依然是可能的.桶式排序和基数排序在合适的条件下就是以线性时间执行的算法. 桶式排序(bucket sort): 思想:如果我们限制需要排序的整数的范围,比如说我们有n个整数,范围从0到m-1,我们可以利用这个信息得到一种快速的排序算法.我们留置一个数组,称之为t,大小为m,并初始化为0.于是t有m个单元(桶),开始时它们都是空的.当i被读入时t[i]加一.在所有的输

常见排序算法导读(10)[基数排序]

与前面介绍的7种排序算法不同,基数排序(Radix Sort)是基于多关键字排序的一种排序算法.也就是说,前面介绍的7种排序算法是建立在对单个元素关键字比较的基础之上,而基数排序则是采用"分配"与"收集"的办法,用对多关键字进行排序的思想实现对单个关键字的排序. 基数排序的典型例子当然就是扑克牌排序啦,几乎所有的数据结构教科书都会讲到,原因是形象易懂.每张扑克牌都有两个关键字:花色和面值.假定有序关系为: 花色: 黑桃 < 红桃 < 梅花 < 方块