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

相关文章

  • 图解Linux下安装Tomcat服务器

    下面是“图解Linux下安装Tomcat服务器”的完整攻略。 准备工作 下载Tomcat,推荐从官网下载:http://tomcat.apache.org/ 确认机器已安装JDK,建议使用OpenJDK 8: sudo apt-get update sudo apt-get install -y openjdk-8-jdk 确认机器中/etc/profile…

    Java 2023年5月19日
    00
  • jmeter的时间戳函数使用

    下面是关于jmeter时间戳函数使用的完整攻略: 1. 理解时间戳函数 在JMeter中,我们可以使用时间戳函数来生成当前时间的UNIX时间戳,以及将UNIX时间戳转换为对应的日期时间格式。时间戳是指自1970年1月1日0点0分0秒(格林威治标准时间)以来经过的秒数。使用时间戳函数可以实现生成唯一的随机数、计算业务日期、模拟系统时间等操作。 2. 时间戳函数…

    Java 2023年5月20日
    00
  • java实现ATM机系统(2.0版)

    Java实现ATM机系统(2.0版)攻略 1. 简介 本文主要介绍如何使用Java语言实现ATM机系统。ATM机系统是现代银行业务基础设施之一,而Java是一门优秀的编程语言,因此使用Java实现ATM机系统具有重要的现实意义和学习价值。 2. 功能需求 ATM机系统需要实现以下功能: 取款 存款 查询余额 修改密码 退出系统 3. 系统架构 ATM机系统的…

    Java 2023年5月23日
    00
  • springboot中.yml文件参数的读取方式

    下面是关于springboot中.yml文件参数的读取方式的完整攻略。 1.参数的读取方式 在springboot中,我们可以使用yml文件作为配置文件,然后通过SpringBoot提供的@ConfigurationProperties注解将其中的配置值读取到Java对象中。yml文件中支持的数据类型包括字符串、数字、布尔等基本类型,以及对象类型等。 在ym…

    Java 2023年5月23日
    00
  • JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版整理

    JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版整理 Java是一门非常流行的编程语言,并且拥有着相当完备的文档支持。首先需要明确的是,JDK(Java Development Kit)是JAVA开发工具包,其中包含了许多与开发相关的工具和应用程序。因此,JDK中所包含的文档,便是JAVA开发者苦苦寻找的官方文档。下面介绍如何…

    Java 2023年5月20日
    00
  • Java 基于tcp协议实现文件上传

    下面我来详细讲解一下Java基于tcp协议实现文件上传的完整攻略。 一、前置知识 在实现文件上传之前,需要具备以下知识: Java Socket编程基础知识 Java IO编程基础知识 文件上传的基本概念和流程 二、上传文件的流程 客户端连接服务器,向服务器发送需要上传的文件名、文件大小等信息 服务器接收到客户端发来的信息后,创建文件并打开输出流 客户端开始…

    Java 2023年5月19日
    00
  • Android中ArrayList和数组相互转换

    下面我就来详细讲解一下“Android中ArrayList和数组相互转换”的完整攻略,包含以下内容: 将数组转换成ArrayList 将ArrayList转换成数组 示例说明:数组转ArrayList 示例说明:ArrayList转数组 将数组转换成ArrayList 如果我们需要使用ArrayList来操作数组,那么就需要将数组转换成ArrayList。下…

    Java 2023年5月26日
    00
  • 一篇文章带你复习java知识点

    一篇文章带你复习Java知识点 在本篇文章中,我们将为您提供一篇带你复习Java知识点的完整攻略。无论您是学习Java的初学者还是已有一定Java编程经验的人员,通过阅读本篇文章,您都可以全面系统的回顾Java的知识。 知识点1:Java基础语法 Java的基础语法是Java编程的基础,例如如何声明变量、如何定义方法、如何使用循环和条件语句等等。下面是一些J…

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