美文网首页
计数排序

计数排序

作者: 来自猴子的暴击 | 来源:发表于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