美文网首页
计数排序的简单实现

计数排序的简单实现

作者: 西5d | 来源:发表于2018-10-15 21:43 被阅读19次

计数排序是一种比较特殊的排序,适用于整数排序,同时数组中的最大值和最小值差值不能太大,否则会有空间的浪费,这些都是由它本身的特性决定的。本文作为读了一篇相关文章后的笔记,后面会给出对应的链接,讲的非常详细。
计数排序的思想是通过构建一个统计数组countArray,数组长度为array[max]-array[min]的差值,遍历数组,序号会作为以最小array[min]为基准,来统计数组值分布的情况,依次会按顺序将array[i]中的数写入到统计数组。之后有个操作比较奇特,会重新遍历统计数组,把统计数组的∑i-1赋值给i,这样做的目的是防止两个相同的数导致顺序改变,保证算法的稳定性。这个操作详细来说,在处理统计数组后,其中的值类似[1,1,1,2,2,2,3,3,4,4...],因此在最终生成排序数组的过程中,只有统计数组的值变化了才会赋值,即能保证顺序,又能得到排序结果。
如果有M个数,统计数组即最大值和最小值差值是N,则复杂度计算:遍历一遍获取最大,最小,执行M次;最后遍历获得排序数组,执行M次;中间遍历原始数组加和统计数组,执行M次;以及中间对统计数组遍历,执行N次,结果为3M+N,去掉系数为O(M+N),空间复杂度是O(N)

看图保视力

以下是可以执行的代码:

import java.util.Arrays;
 public class CountSortTest {
    public static void main(String[] args) {
        int[] originArray = new int[] { 12, 87, 43, 23, 32, 19, 23, 31, 45, 61 };
        int[] sortedArray = countSort(originArray);
        System.out.println(Arrays.toString(sortedArray));
    }
     public static int[] countSort(int[] array) {
        if (array == null || array.length <= 1) {
            return array;
        }
        int max = array[0], min = array[0];
        for (int i = 0; i < array.length; i++) {
            if (max < array[i]) {
                max = array[i];
            }
             if (min > array[i]) {
                min = array[i];
            }
        }
         if (max == min) {
            return array;
        }
         int[] countArray = new int[max - min + 1];
        for (int i = 0; i < array.length; i++) {
            countArray[array[i] - min]++;
        }
         //这个有些难以理解,实际是做了标记,统计数组对应位置的值变化后才赋值
        //实际数据为[1,1,1,2,2,3,3,3,3,3,4,4,4,5,5,5 ... ]类似
        int sum = 0;
        for (int i = 0; i < countArray.length; i++) {
            sum += countArray[i];
            countArray[i] = sum;
        }
         int[] sortedArray = new int[array.length];
        for (int i = array.length - 1; i >= 0; i--) {
            sortedArray[countArray[array[i] - min] - 1] = array[i];
            countArray[array[i] - min]--;
        }
         return sortedArray;
    }
}

参考文章:
什么是计数排序

相关文章

  • 计数排序的简单实现

    计数排序是一种比较特殊的排序,适用于整数排序,同时数组中的最大值和最小值差值不能太大,否则会有空间的浪费,这些都是...

  • python实现计数排序(CountSort)

    python实现【计数排序】(CountSort) 算法原理及介绍 计数排序不是基于比较的排序算法,其核心在于将输...

  • 排序算法Java实现

    本文会通过Java语言实现:冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序,希尔排序...

  • 基本排序算法的Python实现

    本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序,计数排序...

  • 排序

    排序 快速排序 归并排序 计数排序 Python实现 理解 详解 稳定:如果a原本在b前面,而a=b,排序之后a仍...

  • 排序算法 --- 计数排序

    前面说的那些排序算法,都是要通过比较来实现的。排序还能不通过比较来实现?是的,计数排序就是这么神奇。 一、排序思想...

  • 2019-08-06

    NumPy - 排序、搜索和计数函数 NumPy中提供了各种排序相关功能。 这些排序函数实现不同的排序算法,每个排...

  • 算法-排序算法总结

    排序类型总结 1 排序算法基础实现 2 排序算法应用 2.1 基础排序 2.2 计数排序应用 2.3 快排应用 2...

  • Python实现计数排序

    计数排序 计数排序是一个非基于比较的排序算法,优势在于在对一定范围内的整数排序时,快于基于比较的排序算法。 算法思...

  • 数组-计数排序

    采用计数排序方式对数组进行排序 计数排序百科:计数排序(Counting Sort),计数排序是一个非基于比较的排...

网友评论

      本文标题:计数排序的简单实现

      本文链接:https://www.haomeiwen.com/subject/mypqzftx.html