计数排序

人盡茶涼 提交于 2019-11-29 05:45:14

技数排序是非比较排序,桶排序的一种

时间复杂度:O(n),空间复杂度O(n)

用一个数组,记录每个值出现的次数。

另一个数字把记录的内容倾倒到此数组(桶)里。

不稳定的计数排序

import java.util.Arrays;

/**
 * @Description 不稳定的计数排序
 * @Author calvin
 * @Date 2019/9/3 21:10
 **/
public class CountSort {

    public static void main(String[] args){
        int[] arr = {2,4,2,3,7,1,1,0,0,5,6,9,8,5,7,4,0,9};

        int[] result = sort(arr);
        System.out.println(Arrays.toString(result));
    }

    private static int[] sort(int[] arr) {

        int [] result = new int[arr.length];

        int[] count = new int[10];
        for(int i =0;i<arr.length;i++){
            count[arr[i]]++;
        }
        System.out.println(Arrays.toString(count));
        for(int i =0,j=0; i<count.length;i++){
            while(count[i]-- >0)
                result [j++] = i;
        }
        return result;
    }
}

稳定的计数算法

import java.util.Arrays;

/**
 * @Description 稳定的计数排序
 * @Author calvin
 * @Date 2019/9/3 21:10
 **/
public class CountSort {

    public static void main(String[] args){
        int[] arr = {2,4,2,3,7,1,1,0,0,5,6,9,8,5,7,4,0,9};

        int[] result = sort(arr);
        System.out.println(Arrays.toString(result));
    }

    private static int[] sort(int[] arr) {
        int [] result = new int[arr.length];
        int[] count = new int[10];
        for(int i =0;i<arr.length;i++){
            count[arr[i]]++;
        }
        System.out.println(Arrays.toString(count));
//        for(int i =0,j=0; i<count.length;i++){
//            while(count[i]-- >0)
//                result [j++] = i;
//        }
        for(int i=1;i<count.length;i++){
            count[i]=count[i]+count[i-1];
        }
        System.out.println(Arrays.toString(count));

        for(int i =arr.length -1;i>=0;i--){
            result[--count[arr[i]]] =arr[i];
        }
        return result;
    }
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!