zoukankan      html  css  js  c++  java
  • 基数排序

    第一步
    以LSD为例,假设原来有一串数值如下所示:
    73, 22, 93, 43, 55, 14, 28, 65, 39, 81
    首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
    0
    1 81
    2 22
    3 73 93 43
    4 14
    5 55 65
    6
    7
    8 28
    9 39
    第二步
    接下来将这些桶子中的数值重新串接起来,成为以下的数列:
    81, 22, 73, 93, 43, 14, 55, 65, 28, 39
    接着再进行一次分配,这次是根据十位数来分配:
    0
    1 14
    2 22 28
    3 39
    4 43
    5 55
    6 65
    7 73
    8 81
    9 93
    第三步
    接下来将这些桶子中的数值重新串接起来,成为以下的数列:
    14, 22, 28, 39, 43, 55, 65, 73, 81, 93
    这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。
    LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。

    var
      n,m:longint;
      sorta:array [0..9,0..3100000] of longint;
      a:array [0..3100000] of longint;
      lg:array [0..9] of longint;
    
    procedure init;
    var i,j,k,x:longint;
    begin
      readln(n); m:=0;
      for i:=1 to n do
      begin
        readln(a[i]);
        x:=trunc(ln(a[i])/ln(10));
        if x+1>m then m:=x+1;
      end;
    end;
    
    procedure sort;
    var i,j,k,x,t:longint;
    begin
      t:=1;
      for i:=1 to m do
      begin
        t:=t*10;
        fillchar(lg,sizeof(lg),0);//清空 
        for j:=1 to n do 
        begin
          x:=a[j] mod t div (t div 10); //取出从左向右数的数字 
          inc(lg[x]);
          sorta[x,lg[x]]:=a[j];//放到数组中 
        end;
        x:=0;
        for j:=0 to 9 do //连接起来 
          for k:=1 to lg[j] do
          begin
            inc(x);
            a[x]:=sorta[j,k];
          end;
      end;
      for i:=1 to n do
        writeln(a[i]);
    end;
    
    begin
      init;
      sort;
    end.
    

      

  • 相关阅读:
    NET 获取实例所表示的日期是星期几
    NET npoi 保存文件
    快速排序
    JAVA poi 合并单元格
    JAVA poi 帮助类
    JAVA 字符串编码转换
    NET npoi 合并单元值处理
    NET npoi帮助类
    Task的暂停,继续,取消
    .net ref与out之间区别
  • 原文地址:https://www.cnblogs.com/cutemush/p/11799499.html
Copyright © 2011-2022 走看看