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

基于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日

相关文章

  • 一文详解Spring Security的基本用法

    一文详解Spring Security的基本用法 Spring Security是Spring框架中用于安全管理的子框架,它提供了一系列机制来保护应用程序的资源不被未经授权的用户访问,是Web应用程序开发中不可或缺的一部分。本文将详细讲解Spring Security的基本用法,包括如何添加依赖、配置安全和认证、以及如何使用注解来保护资源。 添加Spring…

    Java 2023年5月20日
    00
  • Spring Security 核心过滤器链讲解

    对于Spring Security,核心过滤器链可以说是它的核心之一。本文将从什么是核心过滤器链、以及它包含哪些过滤器等方面进行详细讲解。 1. 什么是核心过滤器链? 核心过滤器链是Spring Security运作的基础。当一个请求进来时,它将会被一系列的过滤器处理,处理完成后才会交给真正的应用程序处理。核心过滤器链由一系列的过滤器组成,每个过滤器都有自己…

    Java 2023年5月20日
    00
  • java对象的序列化和反序列化

    下面是Java对象的序列化和反序列化的完整攻略: 概述 Java对象的序列化和反序列化是一种将对象转化成字节序列以便存储和传输的机制,同时也是将字节序列转化为对象的一种机制。 Java序列化通常用于将对象存储到文件中或者通过网络传输数据,反序列化则是将序列化后的字节流转换成原来的对象。 如何序列化和反序列化对象 Java对象的序列化和反序列化可以通过Java…

    Java 2023年5月26日
    00
  • java实现读取、删除文件夹下的文件

    关于Java实现读取、删除文件夹下的文件的攻略,可以分为两个步骤:读取和删除文件。 1. 读取文件 Java中读取文件需要使用File类,它提供了各种方法来处理文件和文件夹。使用File类的方法之一是listFiles(),该方法用于获取在文件夹中的所有文件和文件夹的列表。我们可以使用该方法获得要操作的文件夹下面的所有文件或文件夹。 以下是一个读取文件夹下所…

    Java 2023年5月20日
    00
  • Java正则表达式之split()方法实例详解

    Java正则表达式之split()方法实例详解 简介 Java中的正则表达式是一种常见的字符串处理方式,可以使用它们来匹配、查找、替换或拆分字符串。其中,split()方法是一个非常常用的字符串拆分方法。本文将详细介绍split()方法及其应用。 split()方法参数 split()方法是String类的一个成员方法,用于将字符串根据传入的正则表达式拆分成…

    Java 2023年5月27日
    00
  • SpringBoot整合Mybatis与MybatisPlus方法详细讲解

    下面我将为您详细讲解SpringBoot整合Mybatis与MybatisPlus的方法。 1. SpringBoot整合Mybatis 1.1 添加依赖 首先,在pom.xml文件中添加Mybatis和Mybatis-spring-boot-starter的依赖: <dependency> <groupId>org.mybatis.…

    Java 2023年5月19日
    00
  • java SpringBoot自定义注解,及自定义解析器实现对象自动注入操作

    Java Spring Boot自定义注解及自定义解析器实现对象自动注入操作 在Spring Boot应用程序中,我们可以使用自定义注解和自定义解析器来实现对象自动注入操作。在本文中,我们将详细讲解如何实现Java Spring Boot自定义注解及自定义解析器。 自定义注解 首先,我们需要创建一个自定义注解,用于标记需要自动注入的对象。下面是一个示例: @…

    Java 2023年5月18日
    00
  • Java笔记(15) Collection集合–>List集合

    集合的理解和好处数组一旦定义,长度即固定,不能修改。要添加新元素需要新建数组,然后循环拷贝,非常麻烦 集合可以动态保存任意多个对象,使用比较方便 提供饿了一系列方便的操作对象的方法:add、remove、set、get等 使用集合添加、删除新元素的示意代码,简洁明了 集合主要是两组(单列集合,双列集合)Collection 接口有两个重要的子接口,List …

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