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日

相关文章

  • PHP面试常用算法(推荐)

    对于“PHP面试常用算法(推荐)”这一话题,我可以给出一个较为完整的攻略,如下: PHP面试常用算法(推荐) 1.算法的定义 算法(Algorithm)是指解决问题的方法和步骤,也就是解决问题的具体步骤和策略。算法包括很多种,比如常见的排序算法、查找算法、递归算法等等。在 PHP 的面试中,算法是一个非常重要的考察内容,因此熟练掌握各种算法的基本原理和实现方…

    算法与数据结构 2023年5月19日
    00
  • 快速排序算法在Swift编程中的几种代码实现示例

    让我为您详细讲解“快速排序算法在Swift编程中的几种代码实现示例”的完整攻略。 快速排序算法简介 快速排序是一种常用的排序算法,其基本思想是通过一个枢轴(pivot)将待排序数组分成两个部分,一部分小于枢轴,一部分大于枢轴,然后对这两个部分进行递归排序,最终得到一个有序的数组。 快速排序算法实现 下面是三种在Swift编程中实现快速排序算法的代码示例。 代…

    算法与数据结构 2023年5月19日
    00
  • 用C语言实现二分查找算法

    当实现查找某个元素时,一个常见的算法是二分查找(Binary Search),也称作折半查找。二分查找是一种在有序数组中查找某一特定元素的搜索算法,将目标值与数组的中间元素进行比较,如果中间元素大于目标值,则在左半部分继续查找;如果中间元素小于目标值,则在右半部分继续查找。重复以上步骤,直到找到目标值或者确定目标值不存在。 以下是在C语言中实现二分查找的完整…

    算法与数据结构 2023年5月19日
    00
  • MySQL order by与group by查询优化实现详解

    MySQL的order by与group by是常用的查询优化手段,本篇攻略将详细讲解order by与group by的使用方法及其优化实现。 1. MySQL Order By MySQL Order By 用于对查询结果进行排序,将查询结果按照指定字段的顺序进行排列 ,默认升序排序,也可以指定为降序排序。 SELECT column1, column2…

    算法与数据结构 2023年5月19日
    00
  • C++九种排序具体实现代码

    针对“C++九种排序具体实现代码”的攻略,我将从以下几个方面进行详细讲解: 九种排序算法介绍 排序算法实现代码示例 一些注意事项 九种排序算法介绍 在介绍具体代码实现之前,我们先来了解一下九种排序算法的特点。 冒泡排序(Bubble Sort):通过不断交换相邻的两个元素,将大的元素逐渐往后移动,最后得到有序序列。 快速排序(Quick Sort):通过设定…

    算法与数据结构 2023年5月19日
    00
  • Python实现堆排序案例详解

    Python实现堆排序案例详解 堆排序简介 堆排序是一种基于树形数据结构的排序算法,它的时间复杂度为 O(nlogn),堆排序分为大根堆和小根堆,当堆为大根堆时,堆中每个节点的值都大于或等于其孩子节点的值,当堆为小根堆时,堆中每个节点的值都小于或等于其孩子节点的值。 堆的基本概念 堆是一种完全二叉树,它可以用数组来表示,数组下标从 1 开始,对于下标为 i …

    算法与数据结构 2023年5月19日
    00
  • Swift中排序算法的简单取舍详解

    Swift中排序算法的简单取舍详解 排序算法在编程中是非常常见的算法之一,从小到大或者从大到小排列一串数字列表,这是必不可少的需求。在Swift编程语言中,也提供了多种排序算法供我们使用。但是,不同的排序算法在排序过程中的时间复杂度和空间复杂度往往是不同的。因此,在实际的编程中,我们需要根据实际情况来选择合适的排序算法。本文将为大家详细讲解Swift中四种常…

    算法与数据结构 2023年5月19日
    00
  • C/C++实现三路快速排序算法原理

    C/C++实现三路快速排序算法原理 算法概述 三路快速排序算法是一种优化版本的快速排序算法,能够处理含有大量重复元素的数组,避免了快速排序中大量递归处理相等元素的繁琐工作。 三路快速排序的原理是采用三个指针将数组分成小于、等于和大于三个部分,递归地向下快速排序,最终将整个数组排序。 实现步骤 首先选取数组中的一个元素作为标志物,通常是数组的第一个元素。 定义…

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