排序算法-计数排序(Java)

package com.rao.sort;

import java.util.Arrays;

/**
 * @author Srao
 * @className CountSort
 * @date 2019/12/9 14:47
 * @package com.rao.sort
 * @Description 计数排序
 */
public class CountSort {

    /**
     * 计数排序
     * @param arr:要排序的数组
     * @return
     */
    public static int[] countSort(int[] arr){
        int n = arr.length;
        //先定义两个变量用来存放数组中的最大值和最小值
        int min = arr[0];
        int max = arr[0];
        for (int i = 1; i < n; i++){
            if (max < arr[i]){
                max = arr[i];
            }
            if (arr[i] < min){
                min = arr[i];
            }
        }
        //定义一个长度为len的数组,这样做是为了防止数组中的最小值为1000,最大值为1010
        //这样创建一个大小为10的数组就行了,不用创建大小为1010的数组,浪费空间
        int len = max - min + 1;
        //哪个数字出现了一次,就把它的数字作为下标存起来,假如1006出现了一次,就把temp[1006-1000]加一
        int[] temp = new int[len];
        for (int i = 0; i < n; i++) {
            temp[arr[i] - min]++;
        }
        int k = 0;
        //对temp进行遍历,temp[i]的值就是i出现的次数,加入temp[5]=3,说明(5+1000)出现了3次
        for (int i = 0; i < len; i++) {
            for (int j = temp[i]; j > 0; j--){
                arr[k] = i + min;
                k++;
            }
        }

        return arr;
    }

    public static void main(String[] args) {
        int[] arr = {3, 6, 9, 5, 0};
        System.out.println(Arrays.toString(arr));
        arr = countSort(arr);
        System.out.println(Arrays.toString(arr));

    }
}

  计数排序是一种适合于最大值和最小值的差值不是不是很大的排序。

  基本思想:就是把数组元素作为数组的下标,然后用一个临时数组统计该元素出现的次数,例如 temp[i] = m, 表示元素 i 一共出现了 m 次。最后再把临时数组统计的数据从小到大汇总起来,此时汇总起来是数据是有序的。

猜你喜欢

转载自www.cnblogs.com/rao11/p/12011095.html