排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析。
文章规划:
一。通过自己对排序算法本身的理解,对每个方法写个小测试程序。 具体思路分析不展开描述。
二。通过《大话数据结构》一书的截图,详细分析该算法 。
在此,推荐下程杰老师的《大话数据结构》一书,当然不是打广告,只是以一名读者的身份来客观的看待这本书,确实是通俗易懂,值得一看。
ps:一个较为详细的学习链接 http://blog.csdn.net/MoreWindows/article/category/859207
九。基数排序
一。个人理解
必须说明下,在《大话数据结构》一书中并没有基数排序这算法,而我对该算法的学习也是来自网上一些教程。
所以可能描述的不够详细,还望见谅。
首先,不得不说,基数排序这算法的排序过程算是比较好玩的,比较特别,为那些大胡子致敬。
编程论到极致,核心非代码,即思想。 一点不假
(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,进行了三次分配、收集过程后,变成有序数组。
讲到这里,想必大家对基数排序的思想已经了解了。下面具体看代码。
- #include<stdio.h>
- #define Max_ 10 //数组个数
- #define RADIX_10 10 //整形排序
- #define KEYNUM_31 10 //关键字个数,这里为整形位数
- // 打印结果
- void Show(int arr[], int n)
- {
- int i;
- for ( i=0; i<n; i++ )
- printf("%d ", arr[i]);
- printf("\n");
- }
- // 找到num的从低到高的第pos位的数据
- int GetNumInPos(int num,int pos)
- {
- int temp = 1;
- for (int i = 0; i < pos - 1; i++)
- temp *= 10;
- return (num / temp) % 10;
- }
- //基数排序 pDataArray 无序数组;iDataNum为无序数据个数
- void RadixSort(int* pDataArray, int iDataNum)
- {
- int *radixArrays[RADIX_10]; //分别为0~9的序列空间
- for (int i = 0; i < 10; i++)
- {
- radixArrays[i] = (int *)malloc(sizeof(int) * (iDataNum + 1));
- radixArrays[i][0] = 0; //index为0处记录这组数据的个数
- }
- for (int pos = 1; pos <= KEYNUM_31; pos++) //从个位开始到31位
- {
- for (int i = 0; i < iDataNum; i++) //分配过程
- {
- int num = GetNumInPos(pDataArray[i], pos);
- int index = ++radixArrays[num][0];
- radixArrays[num][index] = pDataArray[i];
- }
- for (int i = 0, j =0; i < RADIX_10; i++) //收集
- {
- for (int k = 1; k <= radixArrays[i][0]; k++)
- pDataArray[j++] = radixArrays[i][k];
- radixArrays[i][0] = 0; //复位
- }
- }
- }
- int main()
- { //测试数据
- int arr_test[Max_] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 };
- //排序前数组序列
- Show( arr_test, Max_ );
- RadixSort( arr_test, Max_);
- //排序后数组序列
- Show( arr_test, Max_ );
- return 0;
- }
注:这个算法也是今天才学的。 一些见解和例子来自一些大牛的博客,具体参见下面我给的链接。
这里,因为《大话数据》结构一书中没有介绍基数排序这个算法,如果我描述的不够详细,具体可以看下面我给出的这些链接,都是不错的学习资料。
太阳落雨 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