Java 十大排序算法之计数排序刨析

Java 十大排序算法之计数排序刨析

算法介绍

计数排序是一个时间复杂度为O(n+k)的非基于比较的排序算法,其中n是待排序元素的个数,k是待排序元素的范围,即待排序元素的最大值减去最小值再加1。

算法通过构建一个长度为k的计数数组来统计每个元素出现的次数,然后借助计数数组按顺序输出每个元素,就完成了排序过程。

因为计数排序是非基于比较的算法,因此可以在一定程度上提高排序效率。不过需要注意的是,计数排序只适用于元素范围不大的场景,如果范围过大,统计计数数组可能会占用大量内存,导致性能下降。

算法过程

  1. 统计待排序元素的出现次数,构建一个长度为k的计数数组countArr,遍历待排序数组,将每个元素出现的次数记录在计数数组中;

  2. 计算元素在有序序列中的位置,根据countArr统计出每个元素的前缀和,即sumArr。sumArr[i]表示小于等于i的元素个数;

  3. 将元素按照sumArr的顺序依次放到有序序列sortedArr中,具体操作如下:

  4. 遍历待排序数组,取元素arr[i];

  5. 查找元素arr[i]在计数数组中的出现次数count,即count=countArr[arr[i]];
  6. 将元素arr[i]插入到sortedArr中的位置sumArr[arr[i]]-1,同时将countArr[arr[i]]-1;
  7. 重复以上过程,直到待排序数组arr中的所有元素都被放到sortedArr中。

代码实现

public static void countSort(int[] arr) {
    if (arr == null || arr.length == 0) {
        return;
    }
    int min = arr[0], max = arr[0];
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] < min) {
            min = arr[i];
        } else if (arr[i] > max) {
            max = arr[i];
        }
    }
    int[] countArr = new int[max - min + 1];
    // 统计出现次数
    for (int i = 0; i < arr.length; i++) {
        countArr[arr[i] - min]++;
    }
    // 计算前缀和
    for (int i = 1; i < countArr.length; i++) {
        countArr[i] += countArr[i - 1];
    }
    int[] sortedArr = new int[arr.length];
    for (int i = arr.length - 1; i >= 0; i--) {
        int pos = countArr[arr[i] - min] - 1;
        sortedArr[pos] = arr[i];
        countArr[arr[i] - min]--;
    }
    System.arraycopy(sortedArr, 0, arr, 0, arr.length);
}

示例说明

示例1

int[] arr = {5, 3, 8, 4, 2, 5, 7, 1, 9, 6};
countSort(arr);
Arrays.toString(arr); // [1, 2, 3, 4, 5, 5, 6, 7, 8, 9]

在该示例中,待排序数组arr中的元素最小值为1,最大值为9,因此计数数组countArr的长度为9,记录每个元素出现的次数后,计算前缀和sumArr,然后根据sumArr将元素依次放到sortedArr中。

示例2

int[] arr = {4, 2, 4, 4, 3, 8, 3, 1, 5, 7};
countSort(arr);
Arrays.toString(arr); // [1, 2, 3, 3, 4, 4, 4, 5, 7, 8]

在该示例中,待排序数组arr中的元素最小值为1,最大值为8,因此计数数组countArr的长度为8,记录每个元素出现的次数后,计算前缀和sumArr,然后根据sumArr将元素依次放到sortedArr中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 十大排序算法之计数排序刨析 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • JS实现给数组对象排序的方法分析

    下面是一份详细讲解“JS实现给数组对象排序的方法分析”的攻略。 一、前言 数组是 JavaScript 中非常常见的一种数据结构,它可以用来存储一系列的数据。而在实际的开发过程中,我们会经常需要对数组进行排序,这里我们就来详细讲解一下如何使用 JavaScript 实现给数组对象排序的方法。 二、排序方法详解 JavaScript 提供了三个内置的方法来对数…

    算法与数据结构 2023年5月19日
    00
  • JS简单数组排序操作示例【sort方法】

    JS简单数组排序操作示例【sort方法】 操作说明 在JavaScript中,通过数组的sort()方法可以对数组进行排序操作。sort()方法会直接对原数组进行排序,返回排序后的原数组。 sort()方法通常需要传入一个比较函数,来指定排序规则。比较函数接收两个参数,分别表示待比较的两个元素,如果返回值小于0,则表示第一个元素排在第二个元素前面;如果返回值…

    算法与数据结构 2023年5月19日
    00
  • Python使用sort和class实现的多级排序功能示例

    下面是关于“Python使用sort和class实现的多级排序功能示例”的完整攻略: 什么是多级排序 在进行数据排序时,我们经常会遇到需要按照多个关键字进行排序的需求。比如,我们需要对一个学生列表按照年级、成绩、姓名的顺序进行排序。这种排序被称为多级排序或者复合排序。 实现多级排序的方法有很多,其中一种常见的方法是使用Python的sort函数结合自定义的比…

    算法与数据结构 2023年5月19日
    00
  • JS中数据结构与算法—排序算法(Sort Algorithm)实例详解

    以下是关于“JS中数据结构与算法—排序算法(Sort Algorithm)实例详解”的完整攻略。 简介 数学中有一种重要的问题是如何将一组数据按照一定的规则有序排列。排序算法(Sort Algorithm)就是解决这种问题的一种算法。 在JS中,包含了许多排序算法的实现,包括:冒泡排序、选择排序、插入排序、快速排序、归并排序等。了解和掌握这些算法,有助于…

    算法与数据结构 2023年5月19日
    00
  • stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)

    STL常用算法介绍 STL(Standard Template Library)是C++标准库的一个庞大组成部分,提供了大量的常用算法,容器以及迭代器等等。这些工具都可以被拿来用来解决大部分的计算问题。其中stl常用算法主要包括排序算法和非变序型队列,下面进行详细讲解。 stl排序算法 STL提供了丰富的排序算法模板,可以直接拿来使用,无需重新实现。以下是一…

    算法与数据结构 2023年5月19日
    00
  • C++中二叉堆排序详解

    C++中二叉堆排序详解 什么是二叉堆排序 二叉堆是一种特殊的二叉树,它有两个特性: 根节点的键值是所有节点中最小/最大的; 对于节点i的键值一定不大/小于它的父节点i/2。 根据第二个规则,我们可以对于任何一个节点i,以i为根的子树都是一个小根堆/大根堆。将二叉堆中最小/最大的根节点取出,然后将最后一个节点放到根位置,再对根节点进行一次向下调整的操作,就可以…

    算法与数据结构 2023年5月19日
    00
  • 人脸检测中AdaBoost算法详解

    人脸检测中AdaBoost算法详解 什么是AdaBoost算法? AdaBoost(Adaptive Boosting,自适应增强算法)是一种分类算法,它可以将若干个弱分类器组合起来形成一个强分类器,以提高分类的准确率和鲁棒性。AdaBoost最初用于人脸识别领域,在实际应用中具有良好的效果。 AdaBoost分类器是如何工作的? AdaBoost分类器是基…

    算法与数据结构 2023年5月19日
    00
  • Javascript实现快速排序(Quicksort)的算法详解

    Javascript实现快速排序的算法详解 在这个攻略中,我们将通过Javascript实现快速排序算法,并讲解算法的详细过程。 快速排序的基本思想 快速排序是一种基于交换的排序算法,其基本思想是通过选择一个基准元素,在一趟排序过程中,将之前需要排序的序列中的元素分割成两个部分,其中,左边部分元素的值都小于基准元素的值,右边部分元素的值都大于基准元素的值,然…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部