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

    2017-08-28 21:27:21、

    writer:pprp

    基数排序,基于每一位进行的桶排序

    实现起来很难,也很巧妙

    代码及讲解如下:

    /*
    @theme: 基数排序
    @writer:pprp
    @start: 21:00
    @end: 21:25
    @declare:优化加强版的桶排序
    @date:2017/8/28
    */
    
    #include <bits/stdc++.h>
    #define maxn 10    //整形排序
    #define maxSize 10     //关键字个数,这里为整形位数
    #define N 100
    
    using namespace std;
    
    int NumInPos(int num,int pos)
    {
        int temp = 1;
        for (int i = 0; i < pos - 1; i++)
            temp *= 10;
    
        return (num / temp) % 10;
    }
    
    
    //data需要排序的数组,Size是数组个数
    void RadixSort(int* data, int Size)
    {
        int *Radix[maxn];    //分别为0~9的序列空间
        for (int i = 0; i < 10; i++)
        {
            Radix[i] = (int *)malloc(sizeof(int) * (Size + 1));
            Radix[i][0] = 0;    //index为0处记录这组数据的个数
        }
        
        //枚举当按照哪一位进行桶排序
        for (int pos = 1; pos <= maxSize; pos++)    //从个位开始到31位
        {
              //将所有的元素按照第POS位进行排序
            for (int i = 0; i < Size; i++)    //分配过程
            {
                int num = NumInPos(data[i], pos);  //第pos位的值为num
                int index = ++Radix[num][0]; //相当于一个计数器
                Radix[num][index] = data[i]; //将该位置的记录中记载下来该元素的值
            }
                //双指针 i是用来指向radix数组,进行遍历
                //       k是用来遍历i指向部分的元素
                //       j是用来指向数组data的指针,进行++
            for (int i = 0, j =0; i < maxn; i++)    //收集0- 9
            {
                for (int k = 1; k <= Radix[i][0]; k++)
                    data[j++] = Radix[i][k];
                Radix[i][0] = 0;    //复位
            }
        }
    }
    
    
    
    int main()
    {
          int a[N];
          for(int i = 0 ;i < 15 ; i ++)
          {
    //          srand((int)time(NULL)+i);
                a[i] = rand()%1000;
                cout << a[i] <<" ";
          }
          cout << endl;     
          
          RadixSort(a,15);
          
          for(int i= 0 ; i < 15; i++)
          {
                cout << a[i] << " ";
          }
          cout << endl;
          
          
          return 0;
    }
  • 相关阅读:
    1104--DNA排序
    poj1050-To the Max
    编译:一个 C 程序的艺术之旅(转载)
    大话同步/异步、阻塞/非阻塞(转载)
    Windows 在 git bash下使用 conda 命令
    Python Multiprocessing 多进程,使用多核CPU计算 并使用tqdm显示进度条
    Python 写入训练日志文件并控制台输出
    nn.Conv2d 参数及输入输出详解
    Python中 list, numpy.array, torch.Tensor 格式相互转化
    Linux 上传代码到github
  • 原文地址:https://www.cnblogs.com/pprp/p/7445835.html
Copyright © 2011-2022 走看看