C#计数排序

计数排序是一种适合于最大值和最小值的差值不是不是很大的排序。例如 temp[i] = m, 表示元素 i 一共出现了 m 次

C#计数排序_第1张图片

 /// 
        /// 计数排序
        /// 
        static void CountSort(int[] arr)
        {
            //1.得到数列的最大值
            int Max = arr[0];
            for (int i = 1; i < arr.Length; i++)
            {
                if (arr[i]>Max)
                {
                    Max = arr[i];
                }
            }
            //2.根据数列最大值确定统计数组的长度
            int[] newArr = new int[Max+1];
            //3.遍历数列,填充统计数组
            for (int i = 0; i < arr.Length; i++)
            {
                newArr[arr[i]]++;
            }
            //4.遍历统计数组,输出结果
            int index = 0;
            for (int i = 0; i < newArr.Length; i++)
            {
                for (int j = 0; j < newArr[i]; j++)
                {
                    arr[index++] = i;
                }
            }
        }

小优化

       static void CountSort(int[] arr)
        {
            //1.得到数列的最大值 和 最小值
            int Max = arr[0];
            int Min = arr[0];

            for (int i = 1; i < arr.Length; i++)
            {
                if (arr[i] > Max) Max = arr[i];
                if (arr[i] < Min) Min = arr[i];
            }
            //2.根据数列最大值确定统计数组的长度
            int[] newArr = new int[Max -Min+ 1];
            //3.遍历数列,填充统计数组 记得加上 偏移量Min
            for (int i = 0; i < arr.Length; i++)
            {
                newArr[arr[i]-Min]++;
            }
            //4.遍历统计数组,输出结果 记得加上 偏移量Min
            int Index = 0;
            for (int i = 0; i < newArr.Length; i++)
            {
                for (int j = 0; j < newArr[i]; j++)
                {
                    arr[Index++] = i+Min;
                }
            }
        }

 

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