基于Java实现计数排序,桶排序和基数排序

yizhihongxing

基于Java实现计数排序、桶排序和基数排序

计数排序(Counting Sort)

计数排序是一种稳定的排序算法,它使用一个计数数组来记录每个元素出现的次数,并按照次数将元素依次输出到结果数组中。

步骤

  1. 初始化一个大小为 max_value 的空计数数组
  2. 遍历待排序数组,将每个元素出现的次数加入计数数组对应下标中
  3. 遍历计数数组,累加每个元素之前出现的次数,得到每个元素应该在排序后的数组中的位置
  4. 将原数组元素按照计数数组排序并输出

代码示例

public static void countingSort(int[] arr, int max_value) {
    int[] count = new int[max_value + 1];

    for (int i = 0; i < arr.length; i++) {
        count[arr[i]]++;
    }

    for (int i = 1; i < count.length; i++) {
        count[i] += count[i - 1];
    }

    int[] output = new int[arr.length];
    for (int i = arr.length - 1; i >= 0; i--) {
        output[count[arr[i]] - 1] = arr[i];
        count[arr[i]]--;
    }

    for (int i = 0; i < arr.length; i++) {
        arr[i] = output[i];
    }
}

桶排序(Bucket Sort)

桶排序是一种分治思想的排序算法,它将待排序数据按照一定的规则(例如区间大小、位数等)分进若干个桶中,再分别对每个桶内元素排序,最后按照桶的顺序将所有元素依次取出即可。

步骤

  1. 根据待排序元素的属性,确定分配到每个桶中元素的范围
  2. 遍历待排序数组,将每个元素分别放入对应的桶中
  3. 分别对每个桶内的元素进行排序
  4. 将所有桶内元素按照顺序依次放回原始数组

代码示例

public static void bucketSort(int[] arr, int num_buckets) {
    // Step 1: Create empty buckets
    List<List<Integer>> buckets = new ArrayList<>();
    for (int i = 0; i < num_buckets; i++) {
        buckets.add(new ArrayList<>());
    }

    // Step 2: Fill buckets with data
    int max_value = Integer.MIN_VALUE;
    for (int value : arr) {
        max_value = Math.max(max_value, value);
        int bucketIndex = (num_buckets * value) / (max_value + 1);
        buckets.get(bucketIndex).add(value);
    }

    // Step 3: Sort each bucket
    for (List<Integer> bucket : buckets) {
        Collections.sort(bucket);
    }

    // Step 4: Merge sorted buckets into output array
    int index = 0;
    for (List<Integer> bucket : buckets) {
        for (int value : bucket) {
            arr[index++] = value;
        }
    }
}

基数排序(Radix Sort)

基数排序是一种按位排序算法,它根据待排序元素的位数,从低位到高位分别对元素进行桶排序,直到最高位排序完成。基数排序可以适用于非负整数的排序。

步骤

  1. 将待排序数组按照个位数值放入桶中
  2. 将桶中元素按照顺序依次排列,形成新的数组
  3. 将新数组按照十位数值放入桶中
  4. 重复 Step 2 和 3,直到最高位排序完成

代码示例

public static void radixSort(int[] arr, int max_digits) {
    int divisor = 1;
    for (int i = 0; i < max_digits; i++) {
        List<List<Integer>> buckets = new ArrayList<>();
        for (int j = 0; j < 10; j++) {
            buckets.add(new ArrayList<>());
        }

        for (int value : arr) {
            int digit = (value / divisor) % 10;
            buckets.get(digit).add(value);
        }

        int index = 0;
        for (List<Integer> bucket : buckets) {
            for (int value : bucket) {
                arr[index++] = value;
            }
        }

        divisor *= 10;
    }
}

示例说明

以下是一个基于计数排序的示例,排序前数组:[4,3,3,4,5,1,2,3,2,1,5],排序后数组:[1,1,2,2,3,3,3,4,4,5,5]

int[] arr = {4,3,3,4,5,1,2,3,2,1,5};
countingSort(arr, 5);
System.out.println(Arrays.toString(arr));

以下是一个基于桶排序的示例,排序前数组:[3,6,9,12,3,7,10,8,5,6],排序后数组:[3,3,5,6,6,7,8,9,10,12]

int[] arr = {3,6,9,12,3,7,10,8,5,6};
bucketSort(arr, 4);
System.out.println(Arrays.toString(arr));

以上是 Java 实现计数排序、桶排序、基数排序的完整攻略,根据不同场景选择不同的算法,可以实现高效的排序。

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

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

相关文章

  • 在IDEA中搭建最小可用SpringMVC项目(纯Java配置)

    以下是关于“在IDEA中搭建最小可用SpringMVC项目(纯Java配置)”的完整攻略,其中包含两个示例。 在IDEA中搭建最小可用SpringMVC项目(纯Java配置) Spring MVC是一个基于Java的Web框架,它可以帮我们快速开发Web应用程序。在IDEA中搭建最小可用SpringMVC项目非常简单,本文将介绍如何使用纯Java配置搭建最小…

    Java 2023年5月17日
    00
  • Mybatis实现传入多个参数的四种方法详细讲解

    Mybatis实现传入多个参数的四种方法详细讲解 在 Mybatis 中,我们常常需要传入多个参数来完成一次数据库操作。在 Mybatis 中,传递多个参数的方法有多种,这篇文章将详细介绍其中四种实现方法。 方法一:多个参数设置为Map 在 Mybatis 中,可以使用 Map 作为传递多个参数的容器。使用 Map 的好处是可以为参数取名,容易理解更易于维护…

    Java 2023年5月20日
    00
  • Spring boot监控Actuator-Admin实现过程详解

    Spring Boot监控Actuator-Admin实现过程详解 Spring Boot Actuator是Spring Boot提供的一个用于监控和管理应用程序的框架。Actuator提供了许多有用的端点,例如/health、/metrics、/info等。Actuator-Admin是一个基于Actuator的UI,它提供了一个可视化的界面,用于监控和…

    Java 2023年5月15日
    00
  • 浅谈Maven的安装及修改为阿里云下载依赖

    下面是详细的“浅谈Maven的安装及修改为阿里云下载依赖”的完整攻略。 一、Maven的安装 下载Maven:打开官方网站 https://maven.apache.org/download.cgi 找到最新的 Maven 安装包,选择apache-maven-x.x.x-bin.zip下载。 安装Maven:将下载的 Maven 安装包解压到指定目录下(如…

    Java 2023年5月20日
    00
  • SpringBoot+Spring Data JPA整合H2数据库的示例代码

    下面我将为您提供“SpringBoot+Spring Data JPA整合H2数据库的示例代码”的详细攻略: 确保本地已经安装好JDK和Maven 创建一个SpringBoot项目,使用Maven构建,在pom.xml中引入以下相关依赖: <dependency> <groupId>org.springframework.boot&l…

    Java 2023年5月20日
    00
  • Spring 4 支持的 Java 8 特性

    Spring 4 支持的 Java 8 特性是在 Spring Framework 4.0 版本中引入的,它充分利用了 Java 8 的新特性,如 Lambda、Stream API、Optional、Date and Time API 等,以提高应用程序的性能和可读性。本文将为您讲解 Spring 4 支持的 Java 8 特性的完整攻略。 支持的新特性 …

    Java 2023年5月31日
    00
  • springboot的类加载器(org.springframework.boot.loader)过程详解

    Spring Boot提供了一种特殊的类加载器(org.springframework.boot.loader),它可以将应用程序打包成一个可执行的JAR文件,并在运行时动态加载类和资源。在本攻略中,我们将详细讲解Spring Boot的类加载器过程,并提供两个示例来说明其用法。 以下是两个示例,介绍Spring Boot的类加载器过程: 示例一:使用Spr…

    Java 2023年5月15日
    00
  • Java jdbc批量多线程读取CVS文件入库

    Java jdbc批量多线程读取CSV文件并入库,可以分为以下步骤: 读取CSV文件:使用开源库OpenCSV或者Apache Commons CSV都可以实现。读取CSV文件时可以使用多线程处理提高效率,可以通过将文件划分为多个小文件,使用多个线程并发读取来实现。 数据库连接:使用JDBC连接数据库,并获取数据库连接对象Connection。可以使用数据库…

    Java 2023年6月16日
    00
合作推广
合作推广
分享本页
返回顶部