计数排序

一、计数排序

  计数排序适用于一定范围内的整数排序。在取值范围不是很大的情况下,它的性能甚至快过那些时间复杂度为O(nlogn)的排序。

计数排序有局限性:

①当数列最大和最小值差距过大是,并不适用计数排序

②当数列元素不是整数时,也不适合计数排序 

二、计数排序的原理

假设数组中有20个随机数,取值范围在0-10,要求用最快的速度把这20个整数从小到大排序。

现在有随机数组[9,3,5,4,9,1,2,7,8,1,3,6,5,3,4,0,10,9,7,9]

 

三、计数排序核心

/***
*	Title:  "算法" 项目
*	主题 : 计数排序
*	Description: 
*	功能 : 
*	Date:  2020-07-15
*	Version:  1.2
*	Author:  Coffee
*	Modify Recoder:  
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CommonSort
{
    class CountSort
    {
        //计数排序(基础版)
        public static int[] BaseSort(int[] array)
        {
            int[] sortedArray = null;
            if (array!=null && array.Length>0)
            {
                //1-得到数列最大值
                int max = array[0];
                int len = array.Length;
                for (int i = 0; i < len; i++)
                {
                    if (array[i] > max)
                    {
                        max = array[i];
                    }
                }

                //2-根据数列最大值确定统计数组的长度
                int[] countArray = new int[max + 1];

                //3-遍历数列,填充统计数组
                int len2 = countArray.Length;
                for (int i = 0; i < len; i++)
                {
                    countArray[array[i]]++;
                }

                //4-遍历统计数组,输出结果
                int index = 0;
                sortedArray = new int[len];
                for (int i = 0; i < len2; i++)
                {
                    for (int j = 0; j < countArray[i]; j++)
                    {
                        sortedArray[index++] = i;
                    }
                }

            }

            return sortedArray;
        }

        //计数排序(升级版)
        public static int[] UpgradeSort(int[] array)
        {
            int[] sortedArray = null;

            if (array!=null && array.Length>0)
            {
                //1-得到数列的最大值和最小值,并计算出差值d
                int max = array[0];
                int min = array[0];

                int len = array.Length;
                for (int i = 0; i < len; i++)
                {
                    if (array[i] > max)
                    {
                        max = array[i];
                    }

                    if (array[i] < min)
                    {
                        min = array[i];
                    }
                }

                int d = max - min;

                //2-创建统计数组并统计对应元素的个数
                int[] countArray = new int[d + 1];
                for (int i = 0; i < len; i++)
                {
                    countArray[array[i] - min]++;
                }

                //3-统计数组做变形,后面的元素等于前面的元素之和
                int len2 = countArray.Length;
                for (int i = 1; i < len2; i++)
                {
                    countArray[i] += countArray[i - 1];
                }

                //4-倒叙遍历原始数列,从统计数组找到正确位置,输出到结果数组
                sortedArray = new int[len];
                for (int i = len - 1; i >= 0; i--)
                {
                    sortedArray[countArray[array[i] - min] - 1] = array[i];
                    countArray[array[i] - min]--;
                }
            }

            return sortedArray;
        }

    }//Class_end
}

四、示例

 

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using Kernal;

namespace CommonSort
{
    class Program
    {
        static void Main(string[] args)
        {
            //时间计时器
            Stopwatch _SW = new Stopwatch();


            Console.WriteLine("原数组为:");
            int[] array = { 69,25,78,1,56,24,98,71,2,6,1,5,8,9};
            Display(array);

            Console.WriteLine("---------------基础计数排序----------------------");
            _SW.Start();
            Console.WriteLine("【升序】基础计数排序后的数组为:");
            int[] tmp = CountSort.BaseSort(array);
            Display(tmp);
            _SW.Stop();
            Console.WriteLine("花费时间为:{0} 毫秒",_SW.Elapsed.TotalMilliseconds);

            Console.WriteLine("---------------升级版计数排序----------------------");
            _SW.Restart();
            Console.WriteLine("【升序】升级版计数排序后的数组为:");
            int[] tmp2 = CountSort.UpgradeSort(array);
            Display(tmp2);
            _SW.Stop();
            Console.WriteLine("花费时间为:{0} 毫秒", _SW.Elapsed.TotalMilliseconds);

          
            Console.Read();
        }//Main_end



        //显示结果
        private static void Display(int[] array)
        {
            string str = null;
            foreach (var item in array)
            {
                str += item + " ";
            }
            Console.WriteLine(str);
        }

    }//Class_end
}

五、运行结果

 计数排序_第1张图片

 

 

 

 

 

你可能感兴趣的:(算法)