zoukankan      html  css  js  c++  java
  • 算法导论83(a)习题解答(基数排序)

    CLRS 8-3(a) : 给定一个整数数组,其中不同的整数中包含的数字个数可能不同,但该数组中,所有整数中总的数字数为n。说明如何在O(n)时间内对该数组进行排序。

    算法思想:

    1)先把各个数字按位数分组。

    2)然后对各个分数进行基数排序

    3)将各个组连接起来即可

    这个题目基本上重复了算法导论8.3-4习题解答(基数排序) 的核心算法.

    #include <iostream>
    #include
    <fstream>
    using namespace std;
    void radix_sort(int* a, constint d, constint length, int radix);
    int getBit(int m, int i, int radix);
    int pow2(int a, int b);
    int main()
    {
      const int LEN =50000;
      int a[LEN];
      for(int i =0; i < LEN; i++)
      {
        a[i]
    = rand()%100000;
      }
      //一位数、二位数、三位数、四位数的个数
      int one 0;
      int ten 0;
      int hundred 0;
      int thousand 0;
      int ten_thousand 0;
      //保存一位数、二位数、三位数、四位数相应的数组
      int* one_arr new int[LEN];
      int* ten_arr =new int[LEN];
      int* hundred_arr =new int[LEN];
      int* thounsand_arr =new int[LEN];
      int* ten_thousand_arr =new int[LEN];
      for(int i =0; i < LEN; i++)
      {
        if(a[i] >=0&& a[i] <10)
          one_arr[one
    ++] = a[i];
        else if(a[i] >=10&& a[i] <100)
          ten_arr[ten
    ++] = a[i];
        else if(a[i] >=100&& a[i] <1000)
          hundred_arr[hundred
    ++] = a[i];
        else if(a[i] >=1000&& a[i] <10000)
          thounsand_arr[thousand
    ++] = a[i];
        else
          ten_thousand_arr[ten_thousand
    ++] = a[i];
      }

      radix_sort(one_arr,
    1, one, 10);
      radix_sort(ten_arr,
    2, ten, 10);
      radix_sort(hundred_arr,
    3, hundred, 10);
      radix_sort(thounsand_arr,
    4, thousand, 10);
      radix_sort(ten_thousand_arr,
    5, ten_thousand, 10);
      int one_to_ten = one + ten;
      int one_to_hundred = one + ten + hundred;
      int one_to_thousand = one + ten + hundred + thousand;
      int one_to_ten_thousand = one + ten + hundred + thousand + ten_thousand;
      for(int i =0; i < LEN; i++)
      {
        if(i < one)
          a[i]
    = one_arr[i];
        else if(i < one_to_ten)
          a[i]
    = ten_arr[i - one];
        else if(i < one_to_hundred)
          a[i]
    = hundred_arr[i - one_to_ten];
        else if(i < one_to_thousand)
          a[i]
    = thounsand_arr[i - one_to_hundred];
        else if(i < one_to_ten_thousand)
          a[i]
    = ten_thousand_arr[i - one_to_thousand];
      }
      const char* file_name "8-3(a).txt";
      ofstream out_to_file;
      out_to_file.open(file_name);
      for(int i =0; i < LEN; i++)
        out_to_file
    <<a[i]<<endl;
      out_to_file.close();
      delete one_arr;
      delete ten_arr;
      delete hundred_arr;
      delete thounsand_arr;
      delete ten_thousand_arr;
      return 0;
    }
    void radix_sort(int* a, constint d, constint length, int radix)
    {
      //存储a中每个元素的余数
      int* remainder =new int[length];
      //统计余数(等同于计数排序中的c)
      int* c =new int[radix];
      //保存排序之后的a
      int* b =new int[length];
      for(int i =0; i < radix; i++)
        c[i]
    =0;
      for(int i =0; i < d; i++)
      {
        for(int j =0; j < length; j++)
        {
          int temp = getBit(a[j], i, radix);
          remainder[j]
    = temp;
          c[temp]
    ++;
        }
        for(int k =1; k < radix; k++)
        c[k]
    = c[k] + c[k -1];
        for(int k = length -1; k >=0; k--)
        {
          b[
    --c[remainder[k]]] = a[k];
          //c[remainder[k]]--;
        }
        for(int k =0; k < radix; k++)
          c[k]
    =0;
        for(int i =0; i < length; i++)
          a[i]
    = b[i];
      }
      delete remainder;
      delete c;
      delete b;
    }
    //得到相应位上的数值
    int getBit(int m, int i, int radix)
    {
       return (m%(pow2(radix, i +1)))/pow2(radix, i);
    }
    //只处理指数b>=0
    int pow2(int a, int b)
    {
      if(b >0)
      {
        int result = a;
        for(int i =0; i < b -1; i++)
          result
    = result*a;
        return result;
      }
      else if(b ==0)
        return 1;
      else
      {
        cout
    <<"不处理指数小于零的情况"<<endl;
        return -1;
      }
    }
    ---
    可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
  • 相关阅读:
    KubeSphere 社区开源负载均衡器 Porter 进入 CNCF 云原生全景图
    The Overview of KubeSphere 3.0
    对象存储在无人驾驶高精度地图的场景实践
    谁来打通混合云“最后一公里”?唯有容器混合云
    QingStor 对象存储架构设计及最佳实践
    如何通过IAM打造零信任安全架构
    智能家居巨头 Aqara 基于 KubeSphere 打造物联网微服务平台
    微信小程序集成jenkins自动打码
    windows运行python,提示import win32file ImportError: DLL load failed: 找不到指定的程序。
    centos7搭建easy-mock服务
  • 原文地址:https://www.cnblogs.com/null00/p/2065070.html
Copyright © 2011-2022 走看看