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

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading.Tasks;
      6 
      7 namespace RadixSort
      8 {
      9     class Program
     10     {
     11         static void Main(string[] args)
     12         {
     13             int[] arr = new int[10];
     14             Random rd = new Random();
     15             for (int i = 0; i < arr.Length; i++)
     16             {
     17                 arr[i] = rd.Next(10000);
     18             }
     19             RadixSort(arr, 4);
     20         }
     21         //基数排序-最低位优先法【LSD(Least significant digital)】
     22         public static void RadixSort(int[] arr, int numberMaxLength)
     23         {
     24             //存放每次排序后的元素
     25             List<int> list = new List<int>();
     26             //十个桶
     27             List<int>[] listArr = new List<int>[10];
     28             //存放当前元素
     29             string currentItem;
     30             //存放当前元素中的字符
     31             char currentChar;
     32             //给十个桶分配内存初始化
     33             for (int i = 0; i < listArr.Length; i++)
     34             {
     35                 listArr[i] = new List<int>();
     36             }
     37             //一共执行numberMaxLength次,numberMaxLength是元素的最大位数
     38             for (int i = 0; i < numberMaxLength; i++)
     39             {
     40                 foreach (int number in arr)
     41                 {
     42                     //当前元素转成字符串
     43                     currentItem = number.ToString();
     44                     try
     45                     {
     46                         //从个位向高位开始分桶
     47                         currentChar = currentItem[currentItem.Length - i - 1];
     48                     }
     49                     catch
     50                     {
     51                         //如果发生异常,则将该数压入listArr[0]。比如说5是没有十位数的,
     52                         //执行上面的操作肯定会发生越界异常的,这正是期望的行为,我们认为5的十位数是0,
     53                         //所以将它压入listArr[0]的桶里。
     54                         listArr[0].Add(number);
     55                         continue;
     56                     }
     57                     switch (currentChar)
     58                     {
     59                         case '0':
     60                             listArr[0].Add(number);
     61                             break;
     62                         case '1':
     63                             listArr[1].Add(number);
     64                             break;
     65                         case '2':
     66                             listArr[2].Add(number);
     67                             break;
     68                         case '3':
     69                             listArr[3].Add(number);
     70                             break;
     71                         case '4':
     72                             listArr[4].Add(number);
     73                             break;
     74                         case '5':
     75                             listArr[5].Add(number);
     76                             break;
     77                         case '6':
     78                             listArr[6].Add(number);
     79                             break;
     80                         case '7':
     81                             listArr[7].Add(number);
     82                             break;
     83                         case '8':
     84                             listArr[8].Add(number);
     85                             break;
     86                         case '9':
     87                             listArr[9].Add(number);
     88                             break;
     89                         default:
     90                             throw new Exception("unknow error");
     91                     }
     92                 }
     93                 //清空list
     94                 list.Clear();
     95                 //将十个桶里的数据重新排列,压入list
     96                 for (int j = 0; j < listArr.Length; j++)
     97                 {
     98                     foreach (int number in listArr[j].ToArray<int>())
     99                     {
    100                         list.Add(number);
    101                         //清空每个桶
    102                         listArr[j].Clear();
    103                     }
    104                 }
    105                 //arr指向重新排列的元素
    106                 arr = list.ToArray<int>();
    107             }
    108             foreach (int i in list)
    109             {
    110                 Console.WriteLine(i);
    111             }
    112         }
    113     }
    114 }
  • 相关阅读:
    移植性问题のCString转char * ,string
    HDU 2894(欧拉回路)
    POJ 1149(最大流)
    POJ 3422 K取方格数(费用流)/TYVJ 1413
    POJ 1112(染色+连通分量+DP)
    POJ 2195(KM模板题)
    POJ 3615(FLOYD应用)
    POJ 1797(SPFA变种)spfa能做很多!
    POJ 1325(最小点覆盖)
    NOI2010 海拔(平面图最大流)
  • 原文地址:https://www.cnblogs.com/HuoAA/p/4417887.html
Copyright © 2011-2022 走看看