如题。

解决方案 »

  1.   

    就是用delphi 写一个基数排序算法。我在网上找不到这个算法的例子。希望你能帮我。
    http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.6.2.htm 
    这个网页是说基数排序的思路,可是我写不出来。很急的。
      

  2.   

    typedef enum {0,1,2,3,4,5,6,7,8,9} digit; //个位数类型
    typedef digit[3] num; //3位自然数类型,假设低位存储在低下标,高位存储在高下标void Enum_Radix_Sort(num a[ ],int n)//利用计数实现基数排序,其中关键字为3位自然数,共有n个自然数
    {
     int number ,pos ;
     num c[MAXSIZE];
     for(j=0;j<3;j++) //依次对个位,十位和百位排序
     {
      for(i=0;i<n;i++) number[a[i][j]]++; //计数
      for(pos[0]=0,i=1;i<n;i++)
       pos[i]=pos[i-1]+num[i]; //把关键字的值映射为元素在排好的序列中的位置
      for(i=0;i<n;i++) //构造有序数组c
       c[pos[a[i][j]]++]=a[i];
      for(i=0;i<n;i++)
       a[i]=c[i];
     }//for
    }//Enum_Radix_Sort
    分析:计数排序是一种稳定的排序方法.正因为如此,它才能够被用来实现基数排序.
      

  3.   

    http://www.xici.net/main.asp?doc=24808008
      

  4.   

    在网上看到一本 《Delphi算法与数据结构》可是找不到电子版的。在源码空间上有下载的。需要分啊。
      

  5.   

    计数排序和基数排序是不是一回事啊。我需要一个基数排序。最好用delphi语法写出来。高手们大哥们帮我一把啊。
      

  6.   

    procedure RadixSort(var R: array of Integer);
    const
      cMaxDigit = 4; //处理的最大位数 //0000~9999type
      PBin = ^TBin; //每个箱子的数据结构
      TBin = record
        rData: Integer; //数据
        rNext: PBin; //下一个箱子
      end;var
      vBinList: array[0..9] of PBin; //箱子列表  procedure pAppendBin(mIndex: Integer; mData: Integer); //将数据放到指定位置的箱子中
      var
        vBin: PBin;
      begin
        if vBinList[mIndex] = nil then
        begin
          New(vBinList[mIndex]);
          vBinList[mIndex].rNext := nil;
          vBinList[mIndex].rData := mData;
        end
        else
        begin
          vBin := vBinList[mIndex];
          while vBin.rNext <> nil do
            vBin := vBin.rNext;
          New(vBin.rNext);
          vBin.rNext.rNext := nil;
          vBin.rNext.rData := mData;
        end;
      end;
      procedure pBinListToArr; //将箱子列表处理成数组
      var
        vPos: Integer;
        vBin: PBin;
        I: Integer;
      begin
        vPos := Low(R);
        for I := 0 to 9 do
        begin
          vBin := vBinList[I];
          while vBin <> nil do
          begin
            R[vPos] := vBin.rData;
            vBin := vBin.rNext;
            Inc(vPos);
          end;
        end;
      end;
      procedure pFreeBin(mIndex: Integer); //释放箱子的资源
      var
        vBin: PBin;
        T: PBin;
      begin
        vBin := vBinList[mIndex];
        while vBin <> nil do
        begin
          T := vBin;
          vBin := vBin.rNext;
          Dispose(T);
        end;
        vBinList[mIndex] := nil;
      end;var
      I: Integer;
      J: Integer;
      vDigit: Integer;
    begin
      FillChar(vBinList, SizeOf(vBinList), 0); //初始箱子列表  vDigit := 1;
      J := 1;
      while J <= cMaxDigit do
      begin
        for I := Low(R) to High(R) do
          pAppendBin(R[I] div vDigit mod 10, R[I]);
        pBinListToArr;
        for I := 0 to 9 do pFreeBin(I);
        vDigit := vDigit * 10;
        Inc(J);
      end;
    end;//Demo
    procedure TForm1.Button1Click(Sender: TObject);
    var
      A: array[0..100] of Integer;
      I: Integer;
    begin
      Randomize;
      Memo1.Clear;
      for I := Low(A) to High(A) do A[I] := Random(10000);
      RadixSort(A);
      for I := Low(A) to High(A) do Memo1.Lines.Add(IntToStr(A[I]));
    end;
      

  7.   

    to:  zswangII(伴水清清)(一贴不灌,何以灌天下?) 
    你的例子只是对数字进行排序。那如果要对字符还有浮点数也进行排序,那应该如果改呢。
    很感谢你给出的代码。谢谢!希望你继续关注我的问题。
      

  8.   

    这个基数排序是用在报表统计出数据后,用户要能自己手动排序用的。
    to:  zswangII(伴水清清)(一贴不灌,何以灌天下?) 
    如果排字符就要有255个箱子才行。请各位高手关注。
      

  9.   

    http://community.csdn.net/Expert/topic/3098/3098063.xml?temp=.1697199
      

  10.   

    //字符串~~
    procedure StringRadixSort(var R: array of string);
    const
      cMaxLength = 4; //处理的最大长度type
      PBin = ^TBin; //每个箱子的数据结构
      TBin = record
        rData: string; //数据
        rNext: PBin; //下一个箱子
      end;var
      vBinList: array[#0..#255] of PBin; //箱子列表  procedure pAppendBin(mIndex: Char; mData: string); //将数据放到指定位置的箱子中
      var
        vBin: PBin;
      begin
        if vBinList[mIndex] = nil then
        begin
          New(vBinList[mIndex]);
          vBinList[mIndex].rNext := nil;
          vBinList[mIndex].rData := mData;
        end
        else
        begin
          vBin := vBinList[mIndex];
          while vBin.rNext <> nil do
            vBin := vBin.rNext;
          New(vBin.rNext);
          vBin.rNext.rNext := nil;
          vBin.rNext.rData := mData;
        end;
      end;
      procedure pBinListToArr; //将箱子列表处理成数组
      var
        vPos: Integer;
        vBin: PBin;
        I: Char;
      begin
        vPos := Low(R);
        for I := Low(vBinList) to High(vBinList) do
        begin
          vBin := vBinList[I];
          while vBin <> nil do
          begin
            R[vPos] := vBin.rData;
            vBin := vBin.rNext;
            Inc(vPos);
          end;
        end;
      end;
      procedure pFreeBin(mIndex: Char); //释放箱子的资源
      var
        vBin: PBin;
        T: PBin;
      begin
        vBin := vBinList[mIndex];
        while vBin <> nil do
        begin
          T := vBin;
          vBin := vBin.rNext;
          Dispose(T);
        end;
        vBinList[mIndex] := nil;
      end;var
      I: Integer;
      J: Integer;
      C: Char;
    begin
      FillChar(vBinList, SizeOf(vBinList), 0); //初始箱子列表  J := 1;
      while J <= cMaxLength do
      begin
        for I := Low(R) to High(R) do
          pAppendBin((Copy(R[I], cMaxLength - J + 1, 1) + #0)[1], R[I]);
        pBinListToArr;
        for C := Low(vBinList) to High(vBinList) do pFreeBin(C);
        Inc(J);
      end;
    end;//Demo
    function RandomString(mChars: string; mLength: Integer): string;
    var
      I: Integer;
    begin
      Result := '';
      if mChars = '' then Exit;
      for I := 1 to mLength do
        Result := Result + mChars[Random(Length(mChars)) + 1];
    end; { RandomString }procedure TForm1.Button1Click(Sender: TObject);
    var
      A: array[0..100] of string;
      I: Integer;
    begin
      Randomize;
      Memo1.Clear;
      for I := Low(A) to High(A) do
        A[I] := RandomString('abcdefghicklmnopqrstuvwxyz', 4);
      StringRadixSort(A);
      for I := Low(A) to High(A) do Memo1.Lines.Add(A[I]);
    end;
      

  11.   

    procedure FloatRadixSort(var R: array of Extended);
    const
      cMaxDigit = 4; //处理的最大长度type
      PBin = ^TBin; //每个箱子的数据结构
      TBin = record
        rData: Extended; //数据
        rNext: PBin; //下一个箱子
      end;var
      vBinList: array[0..9] of PBin; //箱子列表  procedure pAppendBin(mIndex: Integer; mData: Extended); //将数据放到指定位置的箱子中
      var
        vBin: PBin;
      begin
        if vBinList[mIndex] = nil then
        begin
          New(vBinList[mIndex]);
          vBinList[mIndex].rNext := nil;
          vBinList[mIndex].rData := mData;
        end
        else
        begin
          vBin := vBinList[mIndex];
          while vBin.rNext <> nil do
            vBin := vBin.rNext;
          New(vBin.rNext);
          vBin.rNext.rNext := nil;
          vBin.rNext.rData := mData;
        end;
      end;
      procedure pBinListToArr; //将箱子列表处理成数组
      var
        vPos: Integer;
        vBin: PBin;
        I: Integer;
      begin
        vPos := Low(R);
        for I := Low(vBinList) to High(vBinList) do
        begin
          vBin := vBinList[I];
          while vBin <> nil do
          begin
            R[vPos] := vBin.rData;
            vBin := vBin.rNext;
            Inc(vPos);
          end;
        end;
      end;
      procedure pFreeBin(mIndex: Integer); //释放箱子的资源
      var
        vBin: PBin;
        T: PBin;
      begin
        vBin := vBinList[mIndex];
        while vBin <> nil do
        begin
          T := vBin;
          vBin := vBin.rNext;
          Dispose(T);
        end;
        vBinList[mIndex] := nil;
      end;var
      I: Integer;
      J: Integer;
      vDigit: Extended;
    begin
      FillChar(vBinList, SizeOf(vBinList), 0); //初始箱子列表  vDigit := 0.0001;
      J := -cMaxDigit;
      while J <= cMaxDigit do
      begin
        for I := Low(R) to High(R) do
          pAppendBin(Trunc(R[I] / vDigit) mod 10, R[I]);
        pBinListToArr;
        for I := 0 to 9 do pFreeBin(I);
        vDigit := vDigit * 10;
        Inc(J);
      end;
    end;//Demo
    procedure TForm1.Button1Click(Sender: TObject);
    var
      A: array[0..100] of Extended;
      I: Integer;
    begin
      Randomize;
      Memo1.Clear;
      for I := Low(A) to High(A) do A[I] := Random(10000) + Random(10000) * 0.0001;
      FloatRadixSort(A);
      for I := Low(A) to High(A) do Memo1.Lines.Add(FloatToStr(A[I]));
    end;
      

  12.   

    to : zswangII(伴水清清)(一贴不灌,何以灌天下?) 
    太感谢你了。希望能和你多多交流。我的QQ :13470899
    MSN : [email protected]
    太感谢了。
      

  13.   

    CSDN 没有让我失望,真的有高手。谢了。