Java桶排序之基数排序详解

yizhihongxing

Java桶排序之基数排序详解

基本概念

基数排序(Radix Sort),又称桶排法(Bucket Sort),是一种非比较型整数排序算法。其思想是将一个数字序列拆分成多个数字进行比较排序,从个位开始,逐层进行排序,直到最高位排序完成。

实现步骤

  1. 初始化10个桶,代表数字0到9;
  2. 按照从低位到高位的顺序进行排序,首先比较个位,然后比较十位,以此类推,直到最高位;
  3. 把每次排序后得到的结果依次放回原序列中,重复第2步排序,直至最高位排序完成。

代码实现

以下为Java代码实现:

import java.util.Arrays;

public class RadixSort {
  public static void radixSort(int[] arr) {
    if (arr == null || arr.length < 2) {
      return;
    }
    int exp = 1;
    int max = getMax(arr);
    int[] temp = new int[arr.length];
    while (max / exp > 0) {
      int[] bucket = new int[10];
      for (int i = 0; i < arr.length; i++) {
        bucket[(arr[i] / exp) % 10]++;
      }
      for (int i = 1; i < bucket.length; i++) {
        bucket[i] += bucket[i - 1];
      }
      for (int i = arr.length - 1; i >= 0; i--) {
        temp[bucket[(arr[i] / exp) % 10] - 1] = arr[i];
        bucket[(arr[i] / exp) % 10]--;
      }
      System.arraycopy(temp, 0, arr, 0, arr.length);
      exp *= 10;
    }
  }

  public static int getMax(int[] arr) {
    int max = arr[0];
    for (int i = 1; i < arr.length; i++) {
      max = Math.max(max, arr[i]);
    }
    return max;
  }

  public static void main(String[] args) {
    int[] arr = { 170, 45, 75, 90, 802, 24, 2, 66 };
    System.out.println("排序前:" + Arrays.toString(arr));
    radixSort(arr);
    System.out.println("排序后:" + Arrays.toString(arr));
  }
}

示例解析

假设有以下数组:

{25, 34, 12, 10, 23, 45, 56, 74}

首先比较个位数,这个数组中个位数分别是:

{5, 4, 2, 0, 3, 5, 6, 4}

按照个位数依次分配到桶里面,桶的数量 = 0 ~ 9,将桶中元素复写到原数组中,原数组变成:

{10, 12, 23, 34, 25, 45, 56, 74}

接下来比较十位数,这个数组中十位数分别是:

{2, 3, 1, 0, 2, 4, 5, 7}

重复上述操作,依次分配到桶中,将桶中元素复写到原数组中,原数组变成:

{10, 12, 23, 25, 34, 45, 56, 74}

最后按照百位数比较排序,由于没有百位数,所以排序已完成,最终得到排序后的数组:

{10, 12, 23, 25, 34, 45, 56, 74}

总结

基数排序是一种非常高效的排序算法,它的时间复杂度为O(kn),其中k为数字的最高位数,n为数字个数,相较于快速排序的平均时间复杂度O(nlogn)更具优势。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java桶排序之基数排序详解 - Python技术站

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

相关文章

  • JS使用单链表统计英语单词出现次数

    下面是JS使用单链表统计英语单词出现次数的完整攻略。 1. 理解单链表 单链表是一种常见的数据结构,也是一种线性结构,其中每个节点只有一个指针,指向它的后继节点。单链表一般由头指针和头结点组成,头结点不存放任何实际数据。在单链表中,节点可以进行插入、删除、查找等基本操作,是一种十分常用的数据结构。 2. 思路分析 要使用单链表统计英语单词出现次数,可以将单词…

    算法与数据结构 2023年5月19日
    00
  • C语言快速排序函数用法(qsort)

    C语言快速排序函数用法(qsort) 简介 快速排序是一种常见的排序算法,而C语言中的qsort函数则是一种快速排序的实现。使用qsort函数,我们无需自己编写快速排序算法的代码,只需要提供一个排序所需的比较函数即可。使用qsort函数,既可以方便的排序数组,还可以排序链表等数据结构。 函数原型 void qsort(void *base, size_t n…

    算法与数据结构 2023年5月19日
    00
  • javascript笛卡尔积算法实现方法

    JavaScript笛卡尔积算法实现方法 什么是笛卡尔积 笛卡尔积是指给定多个集合,每个集合中分别选取一个元素组成的所有可能组合的集合。例如,有两个集合 X={1,2} 和 Y={3,4},那么它们的笛卡尔积为 {(1,3), (1,4), (2,3), (2,4)}。 实现笛卡尔积算法 JavaScript实现笛卡尔积算法的过程可以分为以下三步: 遍历所有…

    算法与数据结构 2023年5月19日
    00
  • C语言排序算法之选择排序(直接选择排序,堆排序)

    C语言排序算法之选择排序 选择排序概述 选择排序是一种简单直观的排序算法,其基本思想是:每一趟从数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列最后,直到全部数据元素排完为止。 选择排序算法的时间复杂度为O(n^2),在数据规模较小时效率较高,但是在数据规模较大时效率较低。 选择排序示例 以下是一个使用选择排序算法对数组进行排序的示例: #in…

    算法与数据结构 2023年5月19日
    00
  • python计数排序和基数排序算法实例

    Python计数排序和基数排序算法实例攻略 计数排序和基数排序是排序算法中比较高效的一类算法,适用于整数排序,具有时间复杂度O(n+k)的优秀特性。本文将为大家详细讲解Python中计数排序和基数排序算法实现的完整攻略。 1. 计数排序算法实现 计数排序的核心思想是统计每个数在序列中出现的次数,然后通过累加计算出每个数所在的位置。具体实现步骤如下: 找到序列…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现基础排序算法的示例详解

    JavaScript实现基础排序算法的示例详解 排序算法可以说是计算机科学中最基础的算法之一。而对于前端开发者来说,掌握一些简单的排序算法是很有必要的,因为它们可以帮助我们解决很多实际问题,如搜索结果排序、排名等。在这里,我们将讲解JavaScript如何实现基础排序算法。 冒泡排序 冒泡排序是最简单的排序算法之一。它将数组中的元素两两比较,如果顺序不正确就…

    算法与数据结构 2023年5月19日
    00
  • PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】

    PHP四种排序算法实现及效率分析 本文将介绍 PHP 中的四种常用排序算法,这四种算法分别是冒泡排序、插入排序、选择排序和快速排序。我们会详细讲解它们的思路、实现方式和效率分析,并对比它们的优缺点,让读者可以更好地理解和运用它们。 冒泡排序 冒泡排序是最基本、最简单的排序算法,其核心思想是从左往右依次比较相邻的两个元素,如果前面的元素比后面的元素大,则交换两…

    算法与数据结构 2023年5月19日
    00
  • C++实现堆排序示例

    下面就详细讲解一下“C++实现堆排序示例”的完整攻略。 什么是堆排序 堆排序是一种树形选择排序方法,它是通过将待排序的序列构建成一个堆,在堆中,全局最大或最小的元素总是位于根节点,根节点最大或最小的元素会被输出到一个新的序列中,再将剩余的元素重新构建成堆进行下一轮循环,直到所有元素均被输出为止。 实现步骤 堆排序主要有两个步骤:构建堆和调整堆。 构建堆 将待…

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