JAVA计数排序代码

计数算法学习使用代码如下

import utils.AlgorithmUtils;

import java.util.Arrays;

/**
 * 计数排序:辅助计数数组auxiliary用来记录每个元素出现的次数,然后挨个取出即可
 * 例如:
 *
 *  3 2 5 4 4
 *
 *  arr[0] arr[1] arr[2] arr[3] arr[4] arr[5]
 *   0      0       1       1      2    1
 *
 *
 *
 *
 */
public class Count {
    public static int[] countSort(int[] arr) {
        System.out.println("原数组信息: " + Arrays.toString(arr));
        if (arr == null || arr.length == 0) {
            return null;
        }

        int len = arr.length;

		//可使用Math.max()与Math.min()
        int min = AlgorithmUtils.min(arr);
        int max = AlgorithmUtils.max(arr);

        //辅助数组长度
        int[] auxiliary = new int[max - min + 1];

        for (int i = 0; i < len; i++) {
            auxiliary[arr[i] - min]++;
        }

        System.out.println("辅助数组信息: " + Arrays.toString(auxiliary));

        //逐个取出排序元素
        int index = 0;
        for (int i = 0; i < auxiliary.length; i++) {
            if (auxiliary[i] > 0) {
                while (auxiliary[i]-- > 0) {
                    //原数组各个值
                    arr[index] = i + min;
                    index++;
                }
            }
        }
        return arr;
    }

}

package utils;

public class AlgorithmUtils {

    public static void swap(int[] arr, int a, int b) {

        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;

        /* 不常用

        arr[a] = arr[a] + arr[b];
        arr[b] = arr[a] - arr[b];
        arr[a] = arr[a] - arr[b];
        */

    }

    public static int min(int[] arr) {
        int min = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] < min) {
                min = arr[i];
            }
        }
        return min;
    }

    public static int max(int[] arr) {
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        return max;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值