• 基数排序(桶排序)


    桶排序一般用于非数字元素排序,比如26个字母。做了一张图,应该好理解,因为数字是10进制,就准备10个桶,去装每一位的数就行了。

    桶排的空间复杂度比较高,对于万,亿级别的数据不能用桶排来做。

    先取所有数据的最高位,这里4个数最高是千位。

    代码:(转自天与我生博客)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace LearnSort
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] arr = CreateRandomArray(10);//产生随机数组
                Print(arr);//输出数组
                RadixSort(ref arr);//排序
                Print(arr);//输出排序后的结果
                Console.ReadKey();
            }
            public static void RadixSort(ref int[] arr)
            {
                int iMaxLength = GetMaxLength(arr);
                RadixSort(ref arr, iMaxLength);
            }
            //排序
            private static void RadixSort(ref int[] arr, int iMaxLength)
            {
                List<int> list = new List<int>();//存放每次排序后的元素
                List<int>[] listArr = new List<int>[10];//十个桶
                char currnetChar;//存放当前的字符 比如说 某个元素123 中的2
                string currentItem;//存放当前的元素 比如说 某个元素123
                for (int i = 0; i < listArr.Length; i++)//给十个桶分配内存初始化。
                    listArr[i] = new List<int>();
                for (int i = 0; i < iMaxLength; i++)//一共执行iMaxLength次,iMaxLength是元素的最大位数。
                {
                    foreach (int number in arr)//分桶
                    {
                        currentItem = number.ToString();//将当前元素转化成字符串
                        try { currnetChar = currentItem[currentItem.Length-i-1]; }//从个位向高位开始分桶
                        catch { listArr[0].Add(number); continue; }//如果发生异常,则将该数压入listArr[0]。比如说5 是没有十位数的,执行上面的操作肯定会发生越界异常的,这正是期望的行为,我们认为5的十位数是0,所以将它压入listArr[0]的桶里。
                        switch (currnetChar)//通过currnetChar的值,确定它压人哪个桶中。
                        {
                            case '0': listArr[0].Add(number); break;
                            case '1': listArr[1].Add(number); break;
                            case '2': listArr[2].Add(number); break;
                            case '3': listArr[3].Add(number); break;
                            case '4': listArr[4].Add(number); break;
                            case '5': listArr[5].Add(number); break;
                            case '6': listArr[6].Add(number); break;
                            case '7': listArr[7].Add(number); break;
                            case '8': listArr[8].Add(number); break;
                            case '9': listArr[9].Add(number); break;
                            default: throw new Exception("unknow error");
                        }
                    }
                    for (int j = 0; j < listArr.Length; j++)//将十个桶里的数据重新排列,压入list
                        foreach (int number in listArr[j].ToArray<int>())
                        {
                            list.Add(number);
                            listArr[j].Clear();//清空每个桶
                        }
                    arr = list.ToArray<int>();//arr指向重新排列的元素
                    //Console.Write("{0} times:",i);
                    Print(arr);//输出一次排列的结果
                    list.Clear();//清空list
                }
            }
            //得到最大元素的位数
            private static int GetMaxLength(int[] arr)
            {
                int iMaxNumber = Int32.MinValue;
                foreach (int i in arr)//遍历得到最大值
                {
                    if (i > iMaxNumber)
                        iMaxNumber = i;
                }
                return iMaxNumber.ToString().Length;//这样获得最大元素的位数是不是有点投机取巧了...
            }
            //输出数组元素
            public static void Print(int[] arr)
            {
                foreach (int i in arr)
                    System.Console.Write(i.ToString()+'	');
                System.Console.WriteLine();
            }
            //产生随机数组。随机数的范围是0到1000。 参数iLength指产生多少个随机数
            public static int[] CreateRandomArray(int iLength)
            {
                int[] arr = new int[iLength];
                Random random = new Random();
                for (int i = 0; i < iLength; i++)
                    arr[i] = random.Next(0,1001);
                return arr;
            }
        }
    }
    View Code
  • 相关阅读:
    用Django开发简单的POST/GET接口
    搭建Django环境
    用Django创建一个项目
    NodeJS服务器退出:完成任务,优雅退出
    linux 常用bash
    泛型笔记
    finderweb日志查看系统配置使用
    finderweb日志查看系统部署
    jenkins+gitlab自动部署代码
    jenkins 配置 git拉取代码
  • 原文地址:https://www.cnblogs.com/hont/p/3485482.html
Copyright © 2020-2023  润新知