排序9:计数排序

来源:互联网 发布:网络大电影网购机器人 编辑:程序博客网 时间:2024/05/04 20:38

题目:对于一个int数组,请编写一个计数排序算法,对数组元素排序。给定一个int数组A及数组的大小n,请返回排序后的数组。测试样例:[1,2,3,5,2,3],6[1,2,2,3,3,5]

思路:使用桶排序,一般都有要求待排序的数组具有明显的范围,这样才能设置桶排序的范围。桶排序包括计数排序和基数排序,计数排序比较简单直接。

计数排序的思想其实就是使用哈希表来对元素进行排序。①首先需要遍历数组得出数组的最小值和最大值min和max,这是该数组元素的值的范围,于是数组值的范围就是在min~max之间,可能的取值数目是max-min+1个,于是创建数组countArray的大小为max-min+1。用这个数组的下标来表示元素值,用数组的值来表示每个值的个数。由于数组值的范围是[min~max]而数组下标的范围始终是[0~maximin+1]因此2者数目相同但是其实值相差min,因此对于每个数组的值,减去min就是其对应的计数数组的下标位置,即arr[i]在countArray []数组中对应的位置是countArray [arr[i]-min],应该给这个值+1,当遍历完数组后每个元素都放入了其对应的桶中。此时遍历countArray数组,每一个下标对应的元素是i+min;出现的次数就是arrayCount[i]的值,将其覆盖原始的arr[]数组即可。由于使用了哈希表countArray,因此计数排序的空间复杂度是O(n)。

import java.util.*;//计数排序:本质还是哈希表,注意其实值的对应关系即可public class CountingSort {    public int[] countingSort(int[] A, int n) {        //特殊输入        if(A==null||A.length<=0) return A;                //先遍历数组求出数组的最大最小值        int min=A[0];        int max=A[0];                for(int i=1;i<A.length;i++){            if(A[i]<min) min=A[i];            else if(A[i]>max) max=A[i];        }                //已知数组值的范围,创建哈希表作为桶,范围是min~max,则有max-min+1个值        int[] countArray=new int[max-min+1];                //遍历数组,将元素对应到哈希表中,进行次数的计数,注意A[i]值对应的位置为A[i]-min        for(int i=0;i<A.length;i++){            countArray[A[i]-min]++;        }                //需要使用变量index来逐个取出countArray数组中的元素并将其覆盖到A数组,index用于在A数组中移动        int index=0;                //遍历计数数组countArray,将数组元素和出现的系数还原,注意这里是对countArray数组进行遍历而不是对原始数组进行遍历        for(int i=0;i<countArray.length;i++){                        while(countArray[i]>=1){                //注意:countArray数组下标对应的数值为countArray[i]+min                A[index++]=i+min;                countArray[i]--;            }        }    //处理完成后记得返回结果    return A;    }}

0 0