排序算法 — 桶排序

news2024/12/27 12:25:15

文章目录

  • 桶排序介绍
  • 桶排序实现
  • 桶排序复杂度和稳定性
    • 桶排序复杂度
    • 桶排序稳定性
  • 代码实现
  • 核心&总结

桶排序介绍

假设待排序的数组a中共有N个整数,并且已知数组a中数据的范围[0, MAX)。在桶排序时,创建容量为MAX的桶数组r,并将桶数组元素都初始化为0;将容量为MAX的桶数组中的每一个单元都看作一个"桶"。

在排序时,逐个遍历数组a,将数组a的值,作为"桶数组r"的下标。当a中数据被读取时,就将桶的值加1。例如,读取到数组a[3]=5,则将r[5]的值+1。

桶排序实现

假设a={8,2,3,4,3,6,6,3,9}, max=10。此时,将数组a的所有数据都放到需要为0-9的桶中。如下图:

在这里插入图片描述

在将数据放到桶中之后,再通过一定的算法,将桶中的数据提出出来并转换成有序数组。就得到我们想要的结果了。

桶排序复杂度和稳定性

桶排序复杂度

  • 平均时间复杂度: O(n + k)
  • 最佳时间复杂度: O(n + k)
  • 最差时间复杂度: O(n ^ 2)
  • 空间复杂度: O(n * k)

桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。

桶排序稳定性

稳定性: 稳定

代码实现


package com.zxn;

/**
 * @author zxn
 * @ClassName BucketSort
 * @Description
 * @createTime 2023年05月05日 08:12:00
 */
public class BucketSort {
    /*
     * 桶排序
     *
     * 参数说明:
     *     a -- 待排序数组
     *     max -- 数组a中最大值的范围
     */
    public static void bucketSort(int[] a, int max) {
        int[] buckets;

        if (a==null || max<1)
            return ;

        // 创建一个容量为max的数组buckets,并且将buckets中的所有数据都初始化为0。
        buckets = new int[max];

        // 1. 计数
        for(int i = 0; i < a.length; i++) {
            buckets[a[i]]++;
        }

        // 2. 排序
        for (int i = 0, j = 0; i < max; i++) {
            while( (buckets[i]--) >0 ) {
                a[j++] = i;
            }
        }

        buckets = null;
    }

    public static void main(String[] args) {
        int i;
        int a[] = {8,2,3,4,3,6,6,3,9};

        System.out.printf("before sort:");
        for (i=0; i<a.length; i++) {
            System.out.printf("%d ", a[i]);
         }
        System.out.printf("\n");

        bucketSort(a, 10); // 桶排序

        System.out.printf("after  sort:");
        for (i=0; i<a.length; i++) {
            System.out.printf("%d ", a[i]);
         }
        System.out.printf("\n");
    }
}


核心&总结

  • 要求被排序数组的元素必须全部为非负整数
  • 数组最大值为桶的大小
  • 数组元素的值为桶下标
  • 桶元素为数组元素值的个数统计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/490779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AUTOSAR】【通信安全】E2E

目录 一、概述 二、约束和假设 三、依赖模块 四、功能描述 4.1 开发错误 4.1.1 运行时错误 五、API接口 5.1 E2E Profile 接口 5.2 E2E其他接口 一、概述 该文档制定了PRS E2E协议的平台特定实现要求。这包括所使用的接口和数据类型。 E2E保护的概念假设在运行时应对…

探讨Redis缓存问题及解决方案:缓存穿透、缓存击穿、缓存雪崩与缓存预热(如何解决Redis缓存中的常见问题并提高应用性能)

Redis是一种非常流行的开源缓存系统&#xff0c;用于缓存数据以提高应用程序性能。但是&#xff0c;如果我们不注意一些缓存问题&#xff0c;Redis也可能会导致一些性能问题。在本文中&#xff0c;我们将探讨Redis中的一些常见缓存问题&#xff0c;并提供解决方案。 一、缓存穿…

云计算中的边缘计算技术及其应用

章节一&#xff1a;云计算和边缘计算的简介 随着互联网的发展&#xff0c;数据中心的规模不断扩大&#xff0c;云计算也成为了越来越受欢迎的计算模式。但是&#xff0c;云计算存在着一些问题&#xff0c;比如延迟较高&#xff0c;网络瓶颈&#xff0c;数据隐私和安全性等等。…

Canny边缘检测算法

文章目录 前言1、Canny边缘检测算法2、代码1函数 3、代码24、基于tensor数据的代码 前言 最近在向卷积神经网络里的数据预处理和数据增强部分加这个函数&#xff0c;记录一下。 1、Canny边缘检测算法 Canny边缘检测算法是一种经典的边缘检测算法&#xff0c;其基本原理如下&a…

榜单!直接式TPMS前装搭载率突破60%,哪些厂商在领跑

2016年&#xff0c;《乘用车轮胎气压监测系统的性能要求和试验方法》通过强制性国家标准技术审查&#xff1b;根据规定&#xff0c;自2020年1月1日起&#xff0c;所有中国市场在产乘用车将开始实施强制安装TPMS&#xff08;胎压监测系统&#xff09;的要求。 目前&#xff0c;…

vue项目前端解决跨域问题

在前后端分离项目中&#xff0c;跨域是一定会出现的问题&#xff0c;本文主要介绍跨域问题的解决思路&#xff0c;以及在vue项目中如何使用代理的方式在前端解决跨域问题&#xff0c;同时提供一个后段解决的方案。 1、产生原因 跨域问题产生的原因是浏览器的同源策略。浏览器同…

哪款蓝牙耳机便宜又好用?2023公认质量最好的蓝牙耳机推荐

哪款蓝牙耳机便宜又好用&#xff1f;现如今&#xff0c;市面上的蓝牙耳机越来越多&#xff0c;在选择增多的同时也有着不小的困惑&#xff0c;不知道哪款好用。针对这个问题&#xff0c;我来给大家推荐几款质量最好的蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱Lite2蓝…

安装kali虚拟机

1&#xff1a;kali是什么? kali 是由 Offensive Security 公司开发和维护的。它在安全领域是一家知名的、值得信赖的公司它甚至还有一些受人尊敬的认证&#xff0c;来对安全从业人员做资格认证。Kali 也是一个简便的安全解决方案。Kali 并不要求你自己去维护一个 Linux 系统&…

u盘中病毒文件被隐藏怎么恢复?看看这三种方法

U盘是我们日常生活中常用的存储设备&#xff0c;但是如果U盘被病毒感染&#xff0c;可能会导致文件被隐藏或丢失。被病毒隐藏的U盘文件给我们的生活、工作带来了很大的麻烦&#xff0c;因此必须马上采取行动来恢复这些文件。 而解决“u盘文件被病毒隐藏如何恢复正常”的问题原来…

SpringBoot【运维实用篇】---- 日志

SpringBoot【运维实用篇】---- 日志 1. 代码中使用日志工具记录日志教你一招&#xff1a;优化日志对象创建代码 2. 日志输出格式控制3. 日志文件 运维篇最后一部分我们来聊聊日志&#xff0c;日志大家不陌生&#xff0c;简单介绍一下。日志其实就是记录程序日常运行的信息&…

网络安全是一个好的专业吗?

近年我国《网络安全法》政策持续落地&#xff0c;前段时间国家工信部出台意见&#xff0c;加强数据安全、网络安全、功能安全等管理、智能网联汽车安全是关键。针对上次滴滴安全安全审查一事当中&#xff0c;国家网信办强调企业无论在哪上市必须确保国家网络安全安全及关键信息…

UFC718AE01 HIEE300936R0101什么是 ABB 分布式控制系统?

​ UFC718AE01 HIEE300936R0101什么是 ABB 分布式控制系统&#xff1f; 关于 ABB 类别 什么是 ABB 分布式控制系统&#xff1f; ABB 的分布式控制系统 (DCS) 旨在改变多方面、全天候 24 小时的工业流程。ABB 的控制架构持续分析和推动工厂生产力&#xff0c;最大限度地提高资产…

Mysql数据库的存储引擎——必看教程

目录 一、什么是存储引擎 二、MySQL支持的存储引擎 三、常见的存储引擎 1.InnoDB存储引擎 2.MyISAM存储引擎 3.MEMORY存储引擎 四、选择存储引擎 总结 ✨✨✨大家好&#xff0c;我是会飞的鱼-blog&#xff0c;今天我来给大家介绍一下Mysql&#xff0c;有不足之处&#xf…

从 Windows 10/11、7/8 上清空回收站后恢复已删除文件的 6 种方法

Windows&#xff08;包括 Windows 11、10、8、7 和 Vista&#xff09;上的回收站用于回收您打算删除的不需要的文件。如果您删除了一些重要的文件或文件夹并且不小心清空了回收站&#xff0c;您仍然有机会恢复从回收站中删除的文件。这是一个教程&#xff0c;将阐明“如何在清空…

机器学习 day11(决策边界,损失函数)

逻辑回归模型的预测过程 通常来说&#xff0c;我们先选择一个阈值0.5&#xff0c;当f(x) > 0.5时&#xff0c;则预测y为1&#xff0c;当f(x)&#xff1c;0.5时&#xff0c;则预测y为0。由此我们可以得出&#xff0c;当阈值取0.5时&#xff0c;g(z)取0.5&#xff0c;z取0。…

想回西安

五一假期结束了&#xff0c;开始营业总结下跟读者们的交流。 特别感谢大家让我在自己的技术号里面写一些和生活相关的事情&#xff0c;现在正常营业&#xff0c;回复下读者的问题。 问题 发哥&#xff0c;我现在有个疑惑能麻烦帮我解答下嘛。 我已经工作一年多了&#xff0c;但…

这就是实力~ 腾讯云大咖亲码 “redis深度笔记” 无废话全精华

前言 作为这个时代码代码的秃头人员&#xff0c;对Redis肯定是不陌生的&#xff0c;如果连Redis都没用过&#xff0c;还真不好意思出去面试&#xff0c;指不定被面试官吊打多少次。 毕竟现在互联网公司和一些创业公司都要用到Redis&#xff0c;像亚马逊、谷歌、阿里、腾讯都要…

网络安全 | Linux ELF病毒实例

本节将编写一个病毒原型&#xff0c;本病毒原型主要由C语言编写&#xff0c;少部分无法由C语言来完成的底层操作采取GCC内嵌汇编的方式实现。 01、原型病毒实现 现在开始介绍实现的细节&#xff0c;提供原型病毒的伪代码以及流程图&#xff0c;并介绍编译感染过程。以实践的方式…

软件开发全文档下载(史上最详细版)

写在前面 在日常项目开发过程中&#xff0c;会产生大量的过程文档&#xff0c;比如开发过程中的文档、管理过程中的文档、产品相关文档等等&#xff0c;那这些文档我们日常怎么去管理呢&#xff1f;怎么去做规划呢&#xff1f;如何做成通用标准呢&#xff1f;小编特地整理了一…

​ 1、Promise 、axios 、async和await

1.0 同步与异步 【了解】 同步&#xff1a; 具有阻塞性 异步&#xff1a; 异步代码同时执行&#xff0c;谁跑的快谁就先执行完&#xff0c;异步与同步相遇&#xff0c;先让同步执行完毕后再执行异步代码 异步分类&#xff1a;(执行完成时间不确定或代码执行时间过长) 定时器 …