zoukankan      html  css  js  c++  java
  • 【Sort】RadixSort基数排序

    太晚了,明天有时间在写算法思路,先贴代码

    ————————————————————————————————————————————————

    刚答辩完,毕业好难,感觉自己好水

    ————————————————————————————————————————————————

    解题思路:

      由低位到高位进行排序,比如数组33,22,11,44,67,76,95,98,89,107,最大的数107,也就是需要

    三趟排序:

    1.相同位置上的数字按照大小排序

    2.相同位置上,相同大小的数字按照发现的先后排序。

    第一趟,按照个位进行排序,排序后的结果为:11,22,33,44,95,76,67,107,98,89

    第二趟,按照十位进行排序,排序后的结果为:107,11,22,33,44,67,76,89,95,98

    第三趟,按照百位进行排序,排序后的结果为,11,22,33,44,67,76,89,95,98,107

    时间复杂度为O(M*5N),需要线性的外部空间,实际使用中应该较少,不过这种方法的

    变种应该挺有用,比如位排序(http://www.cnblogs.com/fcyworld/p/6147042.html)

     1 #include <iostream>
     2 
     3 using std::cout;
     4 
     5 void radixsort(int *a,int num);
     6 int loop(int *a,int num);
     7 int main()
     8 {
     9     int a[10]={33,22,11,4,7,6,5,98,89,107};
    10     radixsort(a,10);
    11     for(int i=0;i<10;i++)
    12         cout<<a[i]<<" ";
    13     return 0;
    14 }
    15 int loop(int *a,int num)
    16 {
    17   int maxnum=0,i;
    18   for(i=0;i<num;i++)
    19     if(a[i]>maxnum)
    20         maxnum=a[i];
    21     i=1;
    22     maxnum/=10;
    23     while(maxnum>10)
    24         {
    25             i++;
    26             maxnum/=10;
    27         }
    28     return i;
    29 }
    30 void radixsort(int *a,int num)
    31 {
    32     int looptime=loop(a,num);
    33     int *counts=new int[10];
    34     int *tmp=new int[num];
    35     int i,j,k,rs=1;
    36     for(j=0;j<looptime;j++)
    37     {
    38         for(i=0;i<10;i++)
    39             counts[i]=0;
    40         for(i=0;i<num;i++)
    41         {
    42             k=(a[i]/rs)%10;
    43             counts[k]++;
    44         }
    45         for(i=1;i<10;i++)
    46             counts[i]+=counts[i-1];    //确定每个数字出现的次数以及范围,
                              //比如counts[0]=3,counts[1]=5,
                              //那么数字1应该保存的位置就应该在索引8以下,
                              //而数字1出现的次数由原数组中计算,感觉这个方法很巧妙
    47 for(i=0;i<num;i++) 48 { 49 k=(a[i]/rs)%10;        //计算每个数字应该保存的位置 50 tmp[counts[k]-1]=a[i];    // 51 counts[k]--; 52 } 53 for(i=0;i<num;i++) 54 a[i]=tmp[i]; 55 rs*=10; 56 } 57 delete[]tmp; 58 delete[]counts; 59 }
  • 相关阅读:
    Use MusicBrainz in iOS(三)查询专辑的完整信息
    内存寻址一(分段)
    POJ 1018 Communication System (动态规划)
    利用Eclipse中的Maven构建Web项目(二)
    cocos2d-x2.2.3学习
    (排序算法整理)NEFU 30/32
    POJ 1066 昂贵的聘礼
    2014年腾讯暑假实习软件开发笔试题汇总
    Android学习之——自己搭建Http框架(1)
    C 语言之预处理 ---------文件包括
  • 原文地址:https://www.cnblogs.com/fcyworld/p/6175635.html
Copyright © 2011-2022 走看看