数据结构基础加强之计数排序

数据结构基础加强之计数排序

比较排序

常见的排序算法:快速排序,冒泡排序等属于比较排序,即最终的排序结果需要元素之间的比较。每个元素之间需要比较才能确定自己的位置。
在冒泡排序之类的排序中,问题规模为n,又因为需要比较n次,所以平均时间复杂度为O(n²)。在归并排序、快速排序之类的排序中,问题规模通过分治法消减为logN次,所以时间复杂度平均O(nlogn)。

非比较排序

非比较排序:不同比较就能确定元素的位置。如计数排序。
因为不需要通过比较,所有一次遍历即可解决。问题规模为n,算法时间复杂度O(n)。在时间上优于所有的比较排序算法。但这种做法需要消耗大量的空间,是以空间代价来换取时间的优越性。在规模很大时,对空间的要求很大,不适用于实际。

计数排序

因其需要占用大量的空间,所以适用于数据集比较小的情况。仅适用于数据比较集中的情况。
计数排序的基本思想是:对每一个输入的元素arr[i],确定小于 arr[i] 的元素个数。
所以可以直接把 arr[i] 放到它输出数组中的位置上。假设有5个数小于 arr[i],所以 arr[i] 应该放在数组的第6个位置上。
算法流程:
需要的数组:
待排序的数组int[] array = { 1, 9, 6, 8, 7, 3, 4, 2, 0 };
辅助计数数组int[] countArray = new int[max - min + 1] 记录数据出现的次数;
1. 找出待排序数组的最大值和最小值。max = 2,min = 0.
2. 实例化countArrray数组,记录每个元素出现的次数
3. 计算array中元素在countArray中的位置pos = array[index] - min.
4. 由countArray得到排序之后的数组。
代码实现:

public class CountSort {
    public static void main(String[] args) {
        int[] array = { 1, 9, 6, 8, 7, 3, 4, 2, 0 };
        solution(array);
        for (int i : array) {
            System.out.print(i + " ");
        }
    }
    private static void solution(int[] array) {
        int max = array[0];
        int min = array[0];
        for (int i : array) {
            if (i > max) {
                max = i;
            }
            if (i < min) {
                min = i;
            }
        }
        int range = max - min + 1;
        int[] countArray = new int[range];
        for (int i : array) {
            int pos = i - min;
            countArray[pos]++;
        }
        int index = 0;
        for (int i = 0;i < countArray.length;i++) {
            while (countArray[i]-- > 0) {
                array[index++] = i + min;
            }
        }
    }
}

更多详细代码参考:https://github.com/Li-JY/algorithm-and-datastructure/tree/master/src/sort

你可能感兴趣的:(数据结构,数据结构,排序算法,计数排序,java)