链表应用:基数排序

在基数排序( radix sort)中,把数按照某种基数分解为数字,然后对数字进行排序。
例3-1 假定对范围在 0 ~ 9 9 9之间的 1 0个整数进行排序。如果使用 r a n g e = 1 0 0 0来调用 B i n S o r t,那么箱子的初始化将需要 1 0 0 0个执行步,节点分配需要 1 0个执行步,从箱子中收集节点需要 1 0 0 0个执行步,总的执行步数为 2 0 1 0。另一种方法是:
1) 用 B i n S o r t根据数的最低位数字对 1 0个数进行排序。由于每个数字的范围为 0 ~ 9,因此r a n g e = 1 0。图3-17a 给出了具有 1 0个数的链表,图 3-17b 给出了按最低位数字排序后的链表。
2) 用箱子排序算法对1) 中所得到的链表按次低位数字进行排序。同样,有 r a n g e = 1 0。由于箱子排序是稳定排序,次低位数字相同的节点,其相对次序保持不变(与按最低位数字排序时所得到的次序相同)。因此,现在链表是按照最后两位数字进行排序的。图 3-17c 给出了相应的排序结果。
3) 用箱子排序算法对 2) 中所得到的链表按第三位 (最高位 )数字进行排序。 (如果一个数仅包含两位数字,则其第三位数字为 0 )。由于按第三位数字排序是稳定排序,所以第三位数字相同的节点,其相对次序保持不变(与按最后两位数字排序时所得到的次序相同)。因此,现在链表是按照后三位数字进行排序的。图 3-17d 给出了相应的排序结果。

简单的说,基数排序是用一个基r将链表中的数进行分解,然后对分解后的数进行箱子排序。

当使用基数 r=nn个介于 0 ~n c - 1 范围内的整数进行分解时,每个数将可以分解出 c个数字。因此,可以采用 次箱子排序,每次排序时取 r a n g e =n。整个排序所需要的时间为O (c n) = O(n)(因为是一个常量) 。

实现:

参数range为数的范围,radix为基

 1 template<class T>
 2 void Chain<T>::Radixsort(int range,int radix)
 3 {
 4     int cnt = 0;
 5     int r = range-1;
 6     while (r)
 7     {
 8         cnt++;
 9         r /= radix;
10     }
11     int radix1 = radix;
12     int radix2=1;
13     ChainNode<T> **bottom, **top;
14     //箱子初始化
15     bottom = new ChainNode<T>*[radix];
16     top = new ChainNode<T>*[radix];
17     for (int i = 1; i <= cnt;++i)
18     {
19         int b;//箱子索引号
20
21
22         for (b = 0; b < radix; b++)
23         {
24             bottom[b] = 0;
25         }
26
27         for (; first; first = first->link)
28         {
29             b = first->data%(radix1)/radix2;
30             if (bottom[b])
31             {
32                 top[b]->link = first;
33                 top[b] = first;
34             }
35             else
36             {
37                 bottom[b] = top[b] = first;
38             }
39         }
40
41         ChainNode<T> *y = 0;
42         for (b = 0; b < radix; b++)
43         {
44             if (bottom[b])
45             {
46                 if (y)
47                     y->link = bottom[b];
48                 else
49                     first = bottom[b];
50
51                 y = top[b];
52             }
53         }
54         if (y) y->link = 0;
55
56
57         radix2 *= radix;
58         radix1 *= radix;
59
60     }
61     delete[] bottom;
62     delete[] top;
63 }

Binsort(链表应用:箱子排序)与Radixsort的比较:

 1 #include "Chain.h"
 2
 3 #include <cstdlib>
 4 #include <time.h>
 5 #include <sys/timeb.h>
 6 int main()
 7 {
 8     Chain<int> C;
 9     srand(time(NULL));
10     time_t starttime, endtime;
11     timeb time1, time2;
12     int n = 1e6;
13     //产生1000个0~1e6范围内的数,存入链表
14     for (int i = 0; i < 1000;++i)
15     {
16         int x = rand() % n;
17         C.Insert(0, x);
18     }
19
20     cout << "start BinSort" << endl;
21
22     ftime(&time1);
23     time(&starttime);
24
25     C.Binsort(n);
26     ftime(&time2);
27     time(&endtime);
28     cout << difftime(endtime, starttime)+time2.millitm-time1.millitm << endl;
29
30     ftime(&time1);
31     time(&starttime);
32
33     C.Radixsort(n, 100);
34
35     ftime(&time2);
36     time(&endtime);
37     cout << difftime(endtime, starttime) + time2.millitm - time1.millitm << endl;
38
39
40     system("pause");
41
42     return 0;
43 }

时间: 2024-10-05 06:50:15

链表应用:基数排序的相关文章

程序员的十层楼

第1层 菜鸟 第1层楼属于地板层,迈进这层楼的门槛是很低的.基本上懂计算机的基本操作,了解计算机专业的一些基础知识,掌握一门基本的编程语言如C/C++,或者Java,或者JavaScript,...,均可入门迈进这层. 在这层上,中国有着绝对的优势,除了从计算机专业毕业的众多人数外,还有大量的通信.自动化.数学等相关专业的人士进入这一行,此外还有众多的其他专业转行的人士,人数绝对比西方多出甚多.并且还有一个优势就是我们这层人员的平均智商比西方肯定高. 没有多少人愿意一辈子做菜鸟,因为做"菜鸟&q

程序员的十个层次,你属于哪一层?

自西方文艺复兴以来,中国在自然科学方面落后西方很多,软件领域也不例外.当然现在中国的许多程序员们对此可能有许多不同的意见,有些人认为中国的程序员水平远落后于西方,有些则认为中国的程序员个人能力并不比西方的程序员差,只是整个软件产业落后而已. 那么,到底中国的程序员水平比西方程序员水平差,还是中国有许多优秀的程序员达到或超过了西方程序员同等水平呢?要解决这个问题,必须先知道程序员有多少种技术层级,每个层级需要什么样的技术水平,然后再比较中国和西方在各个技术层级的人数,就可以知道到底有没有差距,差距

程序员的十个层次(转)

自西方文艺复兴以来,中国在自然科学方面落后西方很多,软件领域也不例外.当然现在中国的许多程序员们对此可能有许多不同的意见,有些人认为中国的程序员水平远落后于西方,有些则认为中国的程序员个人能力并不比西方的程序员差,只是整个软件产业落后而已. 那么,到底中国的程序员水平比西方程序员水平差,还是中国有许多优秀的程序员达到或超过了西方程序员同等水平呢?要解决这个问题,必须先知道程序员有多少种技术层级,每个层级需要什么样的技术水平,然后再比较中国和西方在各个技术层级的人数,就可以知道到底有没有差距,差距

程序猿的十层楼(举头望银河,低头撸代码)

这篇博文是很早一个同学推荐的,十分有意思.我觉得时常翻出来过一眼有助于戒骄戒躁. 今天我把它搬到自己的领地,再一次举头仰望....这么燥热的天气,看完凉快了很多~~ 原文的链接:https://www.cnblogs.com/flish/archive/2010/12/04/1896273.html 正文 第1层 菜鸟 第1层楼属于地板层,迈进这层楼的门槛是很低的.基本上懂计算机的基本操作,了解计算机专业的一些基础知识,掌握一门基本的编程语言如C/C++,或者Java,或者JavaScript,

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

转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较. 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.在每一次排序中,按照当前位把数组元素放到对应 的桶当中,然后把桶0到桶9中的元素按先进先出的方式放回数组中.这样从最低位排序一直到最高位排序完成以后,

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

转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较. 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.在每一次排序中,按照当前位把数组元素放到对应 的桶当中,然后把桶0到桶9中的元素按先进先出的方式放回数组中.这样从最低位排序一直到最高位排序完成以后,

基数排序/桶排序-单链表实现

今天下午编程实现了基数排序(桶排序),只能说一千个人有一千个哈姆雷特,因此,一千个人可能有一千种基数排序的实现方式,无论是用数组,栈,队列,单链表(都是线性表哦, 好巧,哈哈).重要的是理解该排序算法的思路后,自己也就可以尝试着慢慢写出来了.时间关系,暂且只给出跟人代码(面试黄金月),以后有机会再补充实现思路.新手出道,代码可读性不要期望太高,多包涵,相信以后自己会进步的. typedef struct listnode // 定义节点 { int data; struct listnode *

基数排序(采用链表)

基于两两比较的算法,算法的运行下界为Ω(nlogN),如果想再降低时间复杂度,只能通过其他的非基于比较的方法.基数排序就是一种方法,其时间复杂度为O(N) 基数排序的过程,假设有4个数,我们用链表把他们连一起,这4个数为 321  892   538  439 第一步:我们先创建10个链表,L0~L9,然后按4个数的个位的数字,依次接到相应链表的后面 L0 L1     321 L2     892 L3 L4 L5 L6 L7 L8    538 L9    439 第二步:按连接在链表从L0

基数排序 &lt;最低位优先&gt; 链表实现

1.单刀直入 基数排序是基于多关键字的一种排序,借助"分配"与"收集"两个过程来得到一个有序序列,其时间复杂度为O(d(n+rd)),空间复杂度为O(n+rd),属于稳定的排序... 举个例子,加入有一下待排序列#->278->109->63->930->589->184->505->269->8->83(#为头节点,其他为数据节点) 依次序列,我们可以容易得到一下信息: rd:rd在这里指的是十进制的十,