Java数据结构:计数排序/Counting Sort(第七周)

本文介绍了计数排序,它是一种快捷且稳定性强的排序方法,时间复杂度为O(n + k),空间复杂度为O(K),局限性在于只适用于整数排序。阐述了其基本思想,即统计小于某数的个数确定其位置,还说明了实现方法,包括使用三个数组等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源:大工慕课 链接
作者:Caleb Sung

关于计数排序

计数排序是一种非常快捷的稳定性强的排序方法,时间复杂度O(n+k),其中n为要排序的数的个数,k为要排序的数的组大值。计数排序对一定量的整数排序时候的速度非常快,一般快于其他排序算法。但计数排序局限性比较大,只限于对整数进行排序。计数排序是消耗空间发杂度来获取快捷的排序方法,其空间发展度为O(K),同理K为要排序的最大值。

基本思想

计数排序的基本思想为:一组数在排序之前先统计这组数中其他数小于这个数的个数,则可以确定这个数的位置。例如要排序的数为 7 4 2 1 5 3 1 5;则比7小的有7个数,所有7应该在排序好的数列的第八位,同理3在第四位,对于重复的数字,1在1位和2位(暂且认为第一个1比第二个1小),5和1一样位于6位和7位。

实现方法

首先需要三个数组,第一个数组记录A要排序的数列大小为n,第二个数组B要记录比某个数小的其他数字的个数所以第二个数组的大小应当为K(数列中最大数的大小),第三个数组C为记录排序好了的数列的数组,大小应当为n。
接着需要确定数组最大值并确定B数组的大小。并对每个数由小到大的记录数列中每个数的出现次数。因为是有小到大通过出现次数可以通过前面的所有数的出现次数来确定比这个数小的数的个数,从而确定其位置。
对于重复的数,每排好一个数则对其位置数进行减减操作,以此对完成其余相同的数字进行排位。

参考代码

public class Homework_ds6 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] ar = new int[10];
        for (int i = 0; i < ar.length; i++)
            ar[i] = (int) (Math.random() * 101);
        System.out.println("The random array is:");
        for (int i : ar)
            System.out.print(i + "  ");
        System.out.println();
        CountingSort cs = new CountingSort(ar);
        int[] arr = new int[ar.length];
        arr = cs.sort();
        System.out.println("The array after counting-sorting is:");
        for (int i : arr)
            System.out.print(i + "  ");

    }

}

class CountingSort {
    private int[] array;

    public CountingSort(int[] array) {
        this.array = array;
    }

    public int[] sort() {
        int[] c = new int[findMax(array.length - 1) + 1];
        int[] b = new int[array.length];
        for (int i = 0; i < c.length; i++)
            c[i] = 0;
        for (int i = 0; i < array.length; i++)
            c[array[i]]++;
        for (int i = 1; i < c.length; i++)
            c[i] += c[i - 1];
        for (int i = array.length - 1; i >= 0; i--) {
            b[c[array[i]] - 1] = array[i];
            c[array[i]]--;
        }
        return b;
    }

    private int findMax(int l) {
        if (l == 0)
            return array[0];
        else
            return (array[l] > findMax(l - 1)) ? array[l] : findMax(l - 1);
    }
}

这就是传说中的时间复杂度只有O(n)的排序算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值