排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析。

文章规划:

一。通过自己对排序算法本身的理解,对每个方法写个小测试程序。 具体思路分析不展开描述。

二。通过《大话数据结构》一书的截图,详细分析该算法 。

在此,推荐下程杰老师的《大话数据结构》一书,当然不是打广告,只是以一名读者的身份来客观的看待这本书,确实是通俗易懂,值得一看。

ps:一个较为详细的学习链接   http://blog.csdn.net/MoreWindows/article/category/859207

九。基数排序

一。个人理解

必须说明下,在《大话数据结构》一书中并没有基数排序这算法,而我对该算法的学习也是来自网上一些教程。

所以可能描述的不够详细,还望见谅。

首先,不得不说,基数排序这算法的排序过程算是比较好玩的,比较特别,为那些大胡子致敬。

编程论到极致,核心非代码,即思想。  一点不假

基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位。每次比较完进行排序,直到整个数组有序
主要分为两个过程:
(1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中)
(2)收集,再将放置在0~9号桶中的数据按顺序放到数组中
重复(1)(2)过程,从个位到最高位,直到排好序为止(比如32位无符号整形最大数4294967296,最高位10位)
下面举例说明:

(1)假设有欲排数据序列如下所示:

73  22  93  43  55  14  28  65  39  81

首先根据个位数的数值,在遍历数据时将它们各自分配到编号0至9的桶(个位数值与桶号一一对应)中。

分配结果(逻辑想象)如下图所示:

分配结束后。接下来将所有桶中所盛数据按照桶号由小到大(桶中由顶至底)依次重新收集串起来,得到如下仍然无序的数据序列:

81  22  73  93  43  14  55  65  28  39

接着,再进行一次分配,这次根据十位数值来分配(原理同上),分配结果(逻辑想象)如下图所示:

分配结束后。接下来再将所有桶中所盛的数据(原理同上)依次重新收集串接起来,得到如下的数据序列:

14  22  28  39  43  55  65  73  81  93

观察可以看到,此时原无序数据序列已经排序完毕。如果排序的数据序列有三位数以上的数据,则重复进行以上的动作直至最高位数为止。

现在如果还不理解的话,再看下面一个例子:

以【521 310 72 373 15 546 385 856 187 147】序列为例,具体细节如下图所示:

在数据中最高位为3,进行了三次分配、收集过程后,变成有序数组。

讲到这里,想必大家对基数排序的思想已经了解了。下面具体看代码。

[cpp] view plaincopy
  1. #include<stdio.h>
  2. #define Max_ 10      //数组个数
  3. #define RADIX_10 10    //整形排序
  4. #define KEYNUM_31 10     //关键字个数,这里为整形位数
  5. // 打印结果
  6. void Show(int  arr[], int n)
  7. {
  8. int i;
  9. for ( i=0; i<n; i++ )
  10. printf("%d  ", arr[i]);
  11. printf("\n");
  12. }
  13. // 找到num的从低到高的第pos位的数据
  14. int GetNumInPos(int num,int pos)
  15. {
  16. int temp = 1;
  17. for (int i = 0; i < pos - 1; i++)
  18. temp *= 10;
  19. return (num / temp) % 10;
  20. }
  21. //基数排序  pDataArray 无序数组;iDataNum为无序数据个数
  22. void RadixSort(int* pDataArray, int iDataNum)
  23. {
  24. int *radixArrays[RADIX_10];    //分别为0~9的序列空间
  25. for (int i = 0; i < 10; i++)
  26. {
  27. radixArrays[i] = (int *)malloc(sizeof(int) * (iDataNum + 1));
  28. radixArrays[i][0] = 0;    //index为0处记录这组数据的个数
  29. }
  30. for (int pos = 1; pos <= KEYNUM_31; pos++)    //从个位开始到31位
  31. {
  32. for (int i = 0; i < iDataNum; i++)    //分配过程
  33. {
  34. int num = GetNumInPos(pDataArray[i], pos);
  35. int index = ++radixArrays[num][0];
  36. radixArrays[num][index] = pDataArray[i];
  37. }
  38. for (int i = 0, j =0; i < RADIX_10; i++)    //收集
  39. {
  40. for (int k = 1; k <= radixArrays[i][0]; k++)
  41. pDataArray[j++] = radixArrays[i][k];
  42. radixArrays[i][0] = 0;    //复位
  43. }
  44. }
  45. }
  46. int main()
  47. {   //测试数据
  48. int arr_test[Max_] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 };
  49. //排序前数组序列
  50. Show( arr_test, Max_ );
  51. RadixSort( arr_test, Max_);
  52. //排序后数组序列
  53. Show( arr_test, Max_ );
  54. return 0;
  55. }

注:这个算法也是今天才学的。   一些见解和例子来自一些大牛的博客,具体参见下面我给的链接。

这里,因为《大话数据》结构一书中没有介绍基数排序这个算法,如果我描述的不够详细,具体可以看下面我给出的这些链接,都是不错的学习资料。

太阳落雨  csdn博客 :http://blog.csdn.net/cjf_iceking/article/details/7943609

云卷云舒 博客园:       http://www.cnblogs.com/Braveliu/archive/2013/01/21/2870201.html

算法与数据结构    http://iprai.hust.edu.cn/icl2002/algorithm/algorithm/commonalg/sort/internal_sorting/radix_sort/radix_sort.htm

维基百科           http://zh.wikipedia.org/wiki/基数排序

平凡的程序员  csdn博客 :  http://blog.csdn.net/feixiaoxing/article/details/6876831

排序算法c语言描述---基数排序相关推荐

  1. 排序算法c语言描述---归并排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...

  2. 《数据结构与算法 Python语言描述》 读书笔记

    已经发布博客 <数据结构与算法 Python语言描述> 读书笔记 第二章 抽象数据类型和Python类 2.1 抽象数据类型abstract data type:ADT 2.1.1 使用编 ...

  3. 经典的十种排序算法 C语言版

    经典的十种排序算法(C语言版) 1.冒牌排序 冒牌排序的特点 ​ 一趟一趟的比较待排序的数组,每趟比较中,从前往后,依次比较这个数和下一个数的大小,如果这个数比下一个数大,则交换这两个数,每趟比较后, ...

  4. 数据结构python课后答案_数据结构与算法:Python语言描述 1~5章课后习题

    数据结构与算法:Python语言描述 1~5章课后习题 发布时间:2018-07-19 20:42, 浏览次数:1885 , 标签: Python MarkDown语法写的,不知道为啥上传到CSDN不 ...

  5. java递归单链表查找中间元素_《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(递归)...

    转载请注明出处:http://blog.csdn.net/xdz78 #include #include //查找单链表中的特定元素,<数据结构与算法--c语言描述> 3.11 答案 in ...

  6. 数据结构与算法python描述_数据结构与算法——Python语言描述.pdf

    数据结构与算法--Python语言描述.pdf 欢迎加入非盈利Python编学习交流程QQ群783462347,群里免费提供500+本Python书籍! 欢迎加入非盈利Python编程学习交流程QQ群 ...

  7. 九大排序算法-C语言实现及详解

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...

  8. python数据结构题目_《数据结构与算法Python语言描述》习题第二章第三题(python版)...

    ADT Rational: #定义有理数的抽象数据类型 Rational(self, int num, int den) #构造有理数num/den +(self, Rational r2) #求出本 ...

  9. 算法经典“钓鱼”问题详解 基于贪心算法 C语言描述

    算法经典"钓鱼"问题详解 基于贪心算法 初始条件 在一条水平路边,有 n 2 ≤ n ≤ 25个钓鱼池,从左到右编号为1.2.3.--.n.小明有H1 ≤ H ≤ 16个小时的空余 ...

  10. 算法java语言描述_java语言描述数据结构与算法崔笑颜的博客

    java语言描述数据结构与算法崔笑颜的博客 冒泡排序 插入排序 选择排序 希尔排序 快速排序 归并排序 二分查找package com.demo.test; import java.util.Arra ...

最新文章

  1. 关于学习Python的一点学习总结(7->相关字符串操作)
  2. ios 即时聊天轻松搞定
  3. windows下使用QtXlsx
  4. Java-SpringDataRedis使用入门
  5. c语言分治法求数组最大值,使用分治法求最大子数组的下标。
  6. chrome插件网站
  7. jqGrid列的统计
  8. magento 优化 php.ini,PHP.ini配置文件(中文) | Magento UI
  9. IdentityServer(14)- 通过EntityFramework Core持久化配置和操作数据
  10. Python 连接开放航空交通数据,轻松构建航班跟踪应用!
  11. cin,cerr,clog,cout
  12. stooge sort
  13. 【预训练语言模型】MacBERT: Revisiting Pre-trained Models for Chinese Natural Language Processing
  14. 通信时代的发展与5G未来的发展方向以及面临的业务挑战
  15. CapstoneCS5265设计原理图|CS5265设计DP转HDMI2.0 4K60HZ转换电路|CS5265demoboard
  16. 手把手教如何用Linux下IIO设备(附代码)
  17. 音视频基础:音频(PCM和AAC)
  18. android里面的Activity体系结构(3)_ActivityRecord和Activity状态变化分析说明
  19. 天气API 实时降水预报接口, 实时降雨量数据接口
  20. 当你心情不佳的时候,你会选择什么样的方式来放松自己?

热门文章

  1. 网站怎么样对接微信公众号,看以下操作
  2. WHOIS查询检索,域名信息查询工具软件
  3. 用户体验 | 银行如何优化APP用户体验
  4. 中国未来房价基本走势的分析和预测
  5. 台湾文化记忆库网站现已正式上线
  6. day4-反爬和正则
  7. 北京林业大学matlab公选课,北京林业大学视频类公共选修课学习指引-北京林业大学教务处.DOC...
  8. 爱荷华州立 计算机博士,美国爱荷华州立大学无损检测中心裴宁博士来我院讲学...
  9. android so 瘦身,Android APK 瘦身实践
  10. Mathematica公式与Mathtype公式编辑器和MSword互通