一起学算法(冒泡排序篇)

news2025/1/21 9:00:03

1.概念

冒泡排序(Bubble Sort)又称泡式排序,是一种简单的排序算法

核心思想:它重复地走访过要排列的次数,一次比较两个元素,如果它们的顺序错误就把它们交换过来,走访数列的工作是重复地进行交换直到不需要交换为止,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或者降序排列),就像水中的气泡会冒起来一样

步骤:

  • 比较相邻的元素,如果第一个比第二个大。就交换它们两个
  • 对每一对相邻的元素做同样的工作,从一开始第一对到结尾的最后一对,这步做完后,最后的元素会是最大的数
  • 针对所有的元素重复以上的步骤,除了最后一个
  • 持续每次多越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

 想必一幅图大家已经基本看懂冒泡排序的原理

具体实现:使用双重循环,外层循环控制循环的次数,内层循环进行数字的比较,内层每一次循环结束之后,都要找出最大的数据,放到参与比较的这堆数据的最右边,下次循环不再比较该数

    public void bubbleSort(int[] arr) {
        //入参进行判断
        if (arr == null || arr.length == 0) {
            return;
        }
        //每次确定无序列表中最大的,从右往左
        for (int i = 1; i < arr.length; i++) { // 表示进行的轮数
            //比较的次数是数组的总长度减去已经排好序的长度
            for (int j = 0; j < arr.length - i; j++) { 
               //两两进行比较,直到长度完结
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

leetcode题单:

最后一块石头

 //冒泡排序
    public void bubbleSort(int [] nums){
        if(nums==null||nums.length==0){
            return;
        }
        for (int i =1; i <nums.length; i++) {
            for (int j = 0; j<i ; j++) {
                if(nums[j]>nums[j+1]){
                    int temp=nums[j];
                    nums[j]=nums[j+1];
                    nums[j+1]=temp;
                }
            }
        }
    }

    public int lastStoneWeight(int[] stones) {
        if(stones==null||stones.length==0){
            return 0;
        }
        int n=stones.length-1;
        for (int i =0; i<stones.length-1; i++) {
             bubbleSort(stones);
          if (stones[n - 1] == 0) break;           //说明最多只剩一块石头
             stones[n] -= stones[n - 1];          //两种不同情况使用同一表达式处理
             stones[n - 1] = 0;   
        }
        return stones[n];
    }

元素计数

class Solution {
    //快排   冒泡排序也可以做
    public void fastSort(int [] num,int left,int right){
        if(left>=right){
            return;
        }
        if(num==null||num.length==0){
            return;
        }
        int povit=num[left];
        int i=left;
        int j=right;
        while(i<j){
            while(i<j&&num[j]>povit){
                j--;
            }
            if(i<j){
                num[i++]=num[j];
            }
            while(i<j&&num[i]<povit){
                i++;
            }
            if(i<j){
                num[j--]=num[i];
            }
        }
        num[i]=povit;
        fastSort(num,i+1,right);
        fastSort(num,left,i-1);
    }
    public int countElements(int[] nums) {
      if(nums==null||nums.length==0){
          return 0;
      }
      //将原数组进行排序
      fastSort(nums,0,nums.length-1);
      int ans=0;
        for (int i = 0; i < nums.length; i++) {
            if(nums[i]==nums[0]||nums[i]==nums[nums.length-1]){
                continue;
            }
            ans++;
        }
        return ans;
    }
}

合并两个有序数组

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] arr = new int[m + n];
        int i = 0;
        int j = 0;
        int index = 0;
        // 进行比较
        while (i < m && j < n) {
            if (nums1[i] < nums2[j]) {
                arr[index++] = nums1[i];
                i++;
            } else {
                arr[index++] = nums2[j];
                j++;
            }
        }

        while (i < m) {
            arr[index++] = nums1[i];
            i++;
        }
        while (j < n) {
            arr[index++] = nums2[j];
            j++;
        }
        // 反向填充
        for (int k = 0; k < m + n; k++) {
            nums1[k] = arr[k];
        }


    }
}

数组中两元素的最大乘积

class Solution {
    //快排   冒泡排序也同样可以做
    public void fastSort(int [] num,int left,int right){
        if(left>=right){
            return;
        }
        if(num==null||num.length==0){
            return;
        }
        int povit=num[left];
        int i=left;
        int j=right;
        while(i<j){
            while(i<j&&num[j]>povit){
                j--;
            }
            if(i<j){
                num[i++]=num[j];
            }
            while(i<j&&num[i]<povit){
                i++;
            }
            if(i<j){
                num[j--]=num[i];
            }
        }
        num[i]=povit;
        fastSort(num,i+1,right);
        fastSort(num,left,i-1);
    }
    public int maxProduct(int[] nums) {
     if(nums==null||nums.length==0){
         return 0;
     }
     fastSort(nums,0,nums.length-1);
     return (nums[nums.length-1]-1)*(nums[nums.length-2]-1);
    }
}

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

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

相关文章

【Datawhale夏令营】任务三学习笔记

任务一笔记回顾 任务二笔记回顾 目录 一&#xff1a;竞赛上分流程 1.1问题建模1.2数据分析 1.3数据清洗1.4特征工程 1.5模型训练与验证 二&#xff1a;任务总结与心得 一&#xff1a;竞赛上分流程 问题建模——>数据分析 ——>数据清洗——>特征工程——>模型…

ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000

leetcode上的一道题&#xff0c;当 s “a” 这样的单字符的时候&#xff0c;使用memset会出错&#xff0c;ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000。 有些奇怪&#xff0c; 记录一下&#xff0c;双字符以及以上的时候不会报错&#xff0c;

Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Spring注解开发 一、注解开发定义Bean二、纯注解开发Bean三…

MacOS Sonoma 14.0 (23A5301g) Beta4 带 OC 0.9.3 and FirPE 双分区原版黑苹果镜像

7月26日苹果发布macOS Sonoma Beta 4预览版更新&#xff0c;但部分用户在升级后遇到了各种问题。这一测试版目前还处于开发阶段&#xff0c;因此出现各种问题并不意外。 一、镜像下载&#xff1a; 1.微信公众号&#xff1a;MacOS Sonoma 14.0 (23A5301g) Beta4 带 OC 引导双分…

视频爬虫:解析m3u8文件 python m3u8库,m3u8文件中.ts视频流的解密下载

一、引用的库 这里需要引用的库是&#xff1a;from Crypto.Cipher import AES 有坑哈&#xff0c;python3.0之后直接安装crypto你会发现不管怎么着都会报错。 经过查找资料找到了原因&#xff0c;原来是20年之后crypto已经被pycryptohome替换掉啦&#xff0c; 如果之前安装过…

暴力破解(DVWA和pikachu)

目录 前言暴力破解模式一.pikachu靶场1.基于表单的暴力破解2. 验证码绕过2. token防爆破 二. DVWA1.low,Medium2.High3. Impossible 前言 渗透测试中暴力破解方法解释&#xff1a;通过尝试所有可能的字符组合来猜测密码的方法。 这种攻击方法需要大量计算资源和时间&#xff0…

人类文明进入下个纪元奇点:UFO听证会-恒温超导发现-GPT大模型

今年以来&#xff0c;科技领域出圈的事件频繁发生&#xff0c;每一个事件都意味着一个领域的重大突破的可能。这些事件是UFO听证会、恒温超导LK99的论文、GPT类大模型的广泛应用&#xff0c;我常将这些事件串在一起思考&#xff0c;细思极恐&#xff0c;一种”火鸡与农场主“的…

Vue(待续)

概念 一套用于构建用户界面的渐进式JavaScript框架 Vue可以自底向上逐层的应用&#xff1a; 简单应用:只需一个轻量小巧的核心库。 复杂应用:可以引入各式各样的Vue插件。 1.采用组件化模式&#xff0c;提高代码复用率、且让代码更好维护。 2.声明式编码&#xff0c;让编码人员…

使用Appuploader工具将IPA上传到App Store的最新流程和步骤

​ 苹果官方提供的工具xcode上架ipa非常复杂麻烦。用appuploader 可以在 mac 和windows 上制作管理 证书 &#xff0c;无需钥匙串工具 条件&#xff1a;1.以Windows为例&#xff0c;创建app打包ios需要的证书和描述文件 2.准备好一个苹果开发者账号&#xff08;如果没有到苹果…

C++ | unordered_map与unordered_set的用法指南

目录 前言 一、unordered_set 1、简介 2、构造相关函数 3、容量相关函数 4、修改与查找相关接口 5、迭代器 二、unordered_map 1、简介 2、构造相关函数 3、容量相关接口 4、迭代器、查找与修改相关接口 5、方括号接口 三、红黑树系列与哈希系列对比 前言 unorde…

SpringCloud(待续)

单体架构特点? 简单方便&#xff0c;高度耦合&#xff0c;扩展性差&#xff0c;适合小型项目。例如:学生管理系统 分布式架构特点? 松耦合&#xff0c;扩展性好&#xff0c;但架构复杂&#xff0c;难度大。适合大型互联网项目&#xff0c;例如:京东、淘宝 微服务:一种良好的分…

vue项目环境 搭建

1、安装nodejs 2、安装vue-cli, npm i -g vue/cli-init 3、初始化项目 vue init webpack test 4、运行 cd test npm run dev

【机器学习】西瓜书习题3.5Python编程实现线性判别分析,并给出西瓜数据集 3.0α上的结果

参考代码 结合自己的理解&#xff0c;添加注释。 代码 导入相关的库 import numpy as np import pandas as pd import matplotlib from matplotlib import pyplot as plt导入数据&#xff0c;进行数据处理和特征工程 得到数据集 D { ( x i , y i ) } i 1 m , y i ∈ { 0 ,…

python+opencv学习

1. 把所有绿色通道值变为0 import cv2 import numpy as npimgcv2.imread(2.jpg) #读取图片 img[:,:,1]0 #绿色通道变为0 cv2.imshow(图片,img) #显示图片 cv2.waitKey(0) #无限地显示窗口 人生建议&#xff0c;一定要买书来学习呀&#xff0c;不是说教程不好&#xff0c;而是书…

idea application.yml配置文件没有提示或读不到配置

1.首先确定你的resources文件夹正常且yml文件图表和下面一样 不一样的右键去设置 2.确保你已经缩进了且层级关系正常 3.如果以上都不是&#xff0c;先考虑删除.idea重开试试 4.以上解决不了就装以下两个插件解决

[深入理解NAND Flash] 闪存(NAND Flash) 学习指南

依公开知识及经验整理&#xff0c;付费内容&#xff0c;禁止转载。 所在专栏 《深入理解Flash:闪存特性与实践》 1. 我想和你说 漠然回首&#xff0c;从事存储芯片行业已多年&#xff0c;这些年最宝贵的青春都献给了闪存&#xff0c;虽不说如数家珍&#xff0c;但也算专业。 …

【Git】git reflog git log

前言 日常开发过程中&#xff0c;我们经常会遇到要进行版本回退的情况&#xff0c;这时候需要使用git reflog和git reset 命令 git reflog 常用命令&#xff1a; 1、git reflog -n 查看多少条 2、git reflog show origin 查看远程历史变动 git log 什么都不加默认显示当前分…

SpringBoot项目中的web安全防护

最近这个月公司对项目进行了几次安全性扫描&#xff0c;然后扫描出来了一些安全漏洞&#xff0c;所以最近也一直在修复各种安全漏洞&#xff0c;还有就是最近在备考软考高级系统架构设计师&#xff0c;也刚好复习到了网络安全这一个章节&#xff0c;顺便将最近修复的安全漏洞总…

漏洞利用-PoC-in-GitHub+msf简单利用

查找库-PoC-in-GitHub 里面集成了几乎所有cve漏洞 下载&#xff1a;https://github.com/nomi-sec/PoC-in-GitHub 演示&#xff1a; 如想要查找vulfocus靶场中 Metabase远程命令执行漏洞 的利用方法。 可以下载一个Yomm闪电文件搜索 Yomm闪电文件搜索下载&#xff1a;https://…