美文网首页
计数排序

计数排序

作者: 来自猴子的暴击 | 来源:发表于2019-10-31 16:54 被阅读0次

    面试题:随机15个整数10以内的值new []{9,4,1,2,7,8,1,3,6,5,3,4,0,10,9},怎么样最快排序?

    原理:计数排序,不是基于元素进行比较,而是用数组的下标来确定元素正确的位置。
    思路:遍历这个无序的随机数列,每一个整数按照其值对号入座,对应数组下标的元素进行加1操作。
    比如第一个整数是9,那么数组下标为9的元素加1:new []{0,0,0,0,0,0,0,0,0,9,0}

    这样排序得到的数组状态:

    2,1,1,2,2,1,1,1,1,2, 1

    0,1,2,3,4,5,6,7,8,9,10

    代码如下

    public static int[] countSort(int[] array) {
            //1.得到数列的最大值
            int max = array[0];
            for (int i = 1; i < array.length; i++) {
                if (array[i] > max) {
                    max = array[i];
                }
            }
            //2.根据数列最大值确定统计数组的长度
            int[] countArray = new int[max + 1];
            //3.遍历数列,填充统计数组
            for (int i = 0; i < array.length; i++) {
                //遍历原始数组,按数组下标排序,index下标的值就是排序的值,如果有相同的index值加1
                countArray[array[i]]++;
            }
            //4.遍历统计数组,输出结果
            int index = 0;
            int[] sortedArray = new int[array.length];
            for (int i = 0; i < countArray.length; i++) {
                // 遍历数组下标值,根据countArray[i]的值来遍历index的下标,并且index下标根据countArray[i]的值加一
                for (int j = 0; j < countArray[i]; j++) {
                    sortedArray[index++] = i;
                }
            }
            return sortedArray;
        }
    

    从代码角度来看是可以实现排序,但是也有缺陷,按数组最大值来确实数组下标,这样创建过大的数组,实际用不了这么大的数组,这样就会浪费内存。

    相关文章

      网友评论

          本文标题:计数排序

          本文链接:https://www.haomeiwen.com/subject/lxmtbctx.html