4.三大基础排序 -选择排序、冒泡排序、插入排序

news2024/11/22 21:45:08

排序算法

文章目录

  • 冒泡排序
    • 算法步骤
    • 动图
    • 代码
    • 优化
    • 总结
  • 选择排序
    • 算法步骤
    • 动图
    • 代码
    • 总结
  • 插入排序
    • 算法步骤
    • 动图
    • 代码
    • 总结

排序算法,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。一般默认排序是按照由小到大即升序排列。

冒泡排序

冒泡排序(Bubble Sort)简单的基于比较的排序算法。每次比较相邻两个元素,如果他们的顺序错误就把他们交换过来。由于较大的数据会不断地向上”冒“,所以以冒泡排序命名。

算法步骤

  • 从头开始,比较相邻元素,如果顺序不对,就交换。
  • 每次选出一个局部最大值
  • 走过n - 1 趟后,数组就有序了

动图

请添加图片描述

代码

public class P02_BubbleSort {
    public static void bubbleSort(int[] arr) {
        if(arr == null || arr.length < 2) {
            return;
        }

        for(int i = 0;i < arr.length - 1;i++) {
            for(int j = 0;j < arr.length - 1 - i;j++) {
                if(arr[j] > arr[j + 1]) {
                    swap(arr,j,j + 1);
                }
            }
        }
    }

    public static void swap(int[] arr,int i,int j) {
        int t = arr[i];
        arr[i] = arr[j];
         arr[j] = t;
    }

    public static void main(String[] args) {
        int[] arr = {9,8,7,6,5,4,3,2,1};
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

优化

 public static void bubbleSort(int[] arr) {
        if(arr == null || arr.length < 2) {
            return;
        }

        for(int i = 0;i < arr.length - 1;i++) {
        	boolean success = false; 
            for(int j = 0;j < arr.length - 1 - i;j++) {
                if(arr[j] > arr[j + 1]) {
                    swap(arr,j,j + 1);
                    success = true;
                }
            }
            if(success == false) {
            	break;// 已经有序
            }
        }
}

总结

冒泡排序的时间复杂度 O ( N ) O(N) O(N),空间复杂度 O ( 1 ) O(1) O(1),冒泡排序是一种性能比较差的排序,如果不优化,那么无论是何种数据状况,都要经理 N 2 N^2 N2次比较。冒泡排序大量浪费比较行为,每趟比较只会选择出一个最大值,所以性能较差。

选择排序

选择排序是一种简单直观的基于比较的排序算法,性能不受数据状况的左右,就算是已经有序的数据,也是 O ( N 2 ) O(N^2) O(N2)的时间复杂度。

算法步骤

在这里插入图片描述
(不用交换的没有画出)

  • 0 ~ n - 1 范围 找到最小值 交换到 0 位置
  • 1 ~ n - 1 范围 找到最小值 交换到 1 位置
  • 2 ~ n - 1 范围 找到最小值 交换到 2 位置
  • … …
  • n - 2 ~ n - 1 范围找到较小值 交换到 n - 2 位置
  • 排序完成

动图

请添加图片描述

代码

package package01;

import java.util.Arrays;

public class P01_SelectSort {
    public static void selectSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;

        }
        for (int i = 0; i < arr.length; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                minIndex = arr[minIndex] < arr[j] ? minIndex : j;
            }
            swap(arr, minIndex, i);
        }
    }

    public static void swap(int[] arr, int i, int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }

    public static void main(String[] args) {
        int[] arr = {9,8,7,6,5,4,3,2,1};
        selectSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

总结

选择排序也是一种性能较差的排序算法,性能不受数据状况左右,大量浪费比较行为。

插入排序

在这里插入图片描述

插入排序就像打扑克时拿牌一样,一张一张将扑克牌放到对应的位置,也是一个基于比较的排序。只是插入排序受数据状况影响,当数据状况趋于有序时,插入排序的速度会非常快,趋于 O ( N ) O(N) O(N),但是时间复杂度是最坏情况,所以插入排序的时间复杂度是 O ( N 2 ) O(N^2) O(N2).

算法步骤

在这里插入图片描述
就如上述数据,我们要将这组数字从小到大进行排列。从左往右依次考虑每个数字,让这个数字左边局部有序,考虑完整个数据就有序了。

  • 考虑前 1 1 1 个数 已经有序
  • 考虑前 2 2 2 个数,如果前面的数据大于当前数则交换,做到局部有序
  • 考虑前 3 3 3 个数,如果前面的数据大于当前数则交换,做到局部有序
  • … …
  • 考虑前 n − 1 n - 1 n1 个数,如果前面的数据大于当前数则交换,做到局部有序
  • 完成排序

动图

请添加图片描述

代码

package package01;

import java.util.Arrays;

public class P03_InsertSort {
    public static void insertSort(int[] arr) {
        if(arr == null || arr.length < 2) {
            return;
        }
        for(int i = 1;i < arr.length;i++) {
            for(int j = i - 1;j >= 0 && arr[j] > arr[j + 1];j--) {
                swap(arr,j,j+1);
            }
        }
    }
    public static void swap(int[] arr,int i,int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }
    public static void main(String[] args) {
        int[] arr = {0,9,8,7,6,5,4,3,2,1};
        insertSort(arr);
        System.out.println(Arrays.toString(arr));

    }
}

总结

插入排序的常数时间要优于选择排序和插入排序,但是其时间复杂度仍然是 O ( N 2 ) O(N^2) ON2

如果本篇文章对你有帮助,请点赞、评论、转发,你的支持是我创作的动力。

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

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

相关文章

2.HTML中常用浏览器

2.常用浏览器 2.1 什么是浏览器 浏览器是网页显示&#xff0c;运行的平台。常用的浏览器有IE&#xff0c;火狐&#xff0c;谷歌&#xff0c;Safari和Opera等 平时成为五大浏览器 2.2 浏览器内核 浏览器内核&#xff08;渲染引擎&#xff09;&#xff1a;负责读取网页内容&…

用CMake编译项目 CMake和g++的区别

0.同样是编译c文件有了g为什么又出了个CMake&#xff1f; g适用于要编译的文件较少的情况。 而CMake像是写好的脚本&#xff0c;可以一键编译很多c文件。一.创建项目和CMakeLists.txt文件 1.1 创建一个项目&#xff0c;目录结构如下 1.2 在项目的根目录下创建一个CMakeLists.…

个人常用Linux命令

来自 linux命令学习-2023-8-1 153913.md等 1、切换目录 cd //切换目录 cd change directory cd 目录名 cd .. 返回上一级目录 pwd显示当前所处目录cd 绝对路径 cd ~ 表示一个用户的home目录 cd - 表示上一次访问的目录 cd / 表示进入根目录下//新建目录/data,并且进入/data…

001、Nvidia Jetson Nano Developer KIT(b01)-系统与登录

之——镜像烧录与远程登录 杂谈 Nvidia Jetson Nano Developer KIT&#xff08;b01&#xff0c;4G&#xff09;&#xff0c;系统配置全纪录&#xff0c;镜像烧录、系统安装、远程桌面安装、cuda与torch安装、pycharm、pycuda、tensorrt等等。 正文 1.开发板系统安装 1.1 开发…

创意涌动:CSDN·大学生博主14天创作挑战赛·第二期,正式开启报名!

文章目录 ⭐️ 活动介绍⭐️ 活动详情⭐️ 活动奖品⭐️ 活动流程⭐️ 评审规则⭐️ 报名&投稿注意事项⭐️ 关于活动官方 活动报名地址&#xff08;点击跳转&#xff09; 本次活动与官方活动及其他博主的创作型活动并不不冲突&#xff01; ⭐️ 活动介绍 亲爱的大学生博主…

【无标题】【教3妹学编程-算法题】2918. 数组的最小相等和

3妹&#xff1a;呜呜&#xff0c;烦死了&#xff0c; 脸上长了一个痘 2哥 : 不要在意这些细节嘛&#xff0c;不用管它&#xff0c;过两天自然不就好了。 3妹&#xff1a;切&#xff0c;你不懂&#xff0c;影响这两天的心情哇。 2哥 : 我看你是不急着找工作了啊&#xff0c; 工作…

Leo赠书活动-05期 【打造敏捷测试团队】文末送书5本

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

运动想象 EEG 信号分析

基于运动想象的公开数据集&#xff1a;Data set IVa (BCI Competition III)1 数据描述参考前文&#xff1a;https://blog.csdn.net/qq_43811536/article/details/134224005?spm1001.2014.3001.5501 本文使用公开数据集 Data set IVa 中的部分被试数据&#xff0c;数据已公开可…

Rust和Pytho写一段采集公众号代码

首先&#xff0c;我们需要安装Rust和Python的requests库。Rust的requests库可以用来发送HTTP请求&#xff0c;而Python的requests库可以用来处理HTTP响应。 // 导入所需的库 use std::io; use std::env;// 使用rustc命令来编译我们的程序 fn main() {// 获取命令行参数let args…

GuLi商城-商品服务-API-三级分类-查询-递归树形结构数据获取

导入sql语句 insert into pms_category(cat_id,name,parent_cid,cat_level,show_status,sort,icon,product_unit,product_count) values (1,图书、音像、电子书刊,0,1,1,0,NULL,NULL,0),(2,手机,0,1,1,0,NULL,NULL,0),(3,家用电器,0,1,1,0,NULL,NULL,0),(4,数码,0,1,1,0,NULL…

分享六个 Vue3 开发必备的 VSCode 插件

今天分享 6 个 Vue3 开发必备的 VSCode 插件&#xff0c;可以直接用过 VSCode 的插件中心直接安装使用。 1. Volar &#x1f525; 下载数 153 万 相信使用 VSCode 开发 Vue2 的同学一定对 Vetur 插件不会陌生&#xff0c;作为 Vue2 配套的 VSCode 插件&#xff0c;它的主要作…

混合云中 DevOps 的最佳实践

近年来&#xff0c;出现了各种工具、技术和框架&#xff0c;其目标是增强灵活性、性能和可扩展性。传统的整体方法已被微服务和纳米服务等更加模块化的方法所取代。此外&#xff0c;云计算的兴起导致本地软件被云环境所取代&#xff0c;云环境提供了以前无法提供的广泛优势和功…

获取狮子座明年恋爱运势预测API接口

获取狮子座明年恋爱运势预测API接口的功能是通过API接口获取狮子座明年恋爱运势的预测结果&#xff0c;为用户提供恋爱运势指导。 首先&#xff0c;使用挖数据平台该API接口需要先申请API密钥。在获取API密钥后&#xff0c;可以使用该接口进行开发。 API接口地址为&#xff1a…

[LC 总结] 前缀和(Prefix Sum)总结 10 道相关练习题

[LC 总结] 前缀和&#xff08;Prefix Sum&#xff09;总结& 10 道相关练习题 类型与题目列表如下&#xff1a; 题目的解法都做过了&#xff0c;会留在最后一个部分&#xff0c;接下来就梳理一下 prefix sum&#xff0c;列举的题目从简单到 -> 困难 基础 prefix sum 其…

【深蓝学院】手写VIO第9章--课程总结--笔记

0. 内容 1. 课程回顾 最大后验概率MAP&#xff0c;如果不知道先验则是MLE&#xff0c;如果观测服从高斯分布&#xff08;关于为什么服从高斯分布有个pdf&#xff09;则可转化为LSP。 残差构建主要讲了IMU残差的构建&#xff0c;包括预积分模型&#xff0c;误差模型&#xff08;…

使用Android Jetpack Compose渲染效果打造酷炫的动画效果

如何在Android Jetpack Compose中使用渲染效果打造令人惊艳的视觉体验 学习示例&#xff1a;如何使用渲染效果来改变UI界面 引言 Jetpack Compose提供了各种工具和组件来构建引人入胜的UI&#xff0c;而在Compose中较为鲜为人知的一个宝藏是RenderEffect。 在这篇博文中&a…

freertos任务参数

实现多个任务利用同一个函数&#xff0c;传进不同的任务参数&#xff0c;打印不同的任务内容。多个人用同一个电脑干不同工作&#xff0c;美工用电脑干美工&#xff0c;程序员用电脑敲代码 #include "stm32f10x.h" // Device header #include &quo…

.NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth

前言 我相信做开发的同学应该都对接过各种各样的第三方平台的登录授权&#xff0c;来获取用户信息&#xff08;如&#xff1a;微信登录、支付宝登录、QQ登录、GitHub登录等等&#xff09;。今天给大家推荐一个.NET开源好用的、全面的、方便第三方登录组件集合框架&#xff1a;…

【ES专题】ElasticSearch功能详解与原理剖析

目录 前言要点阅读对象阅读导航前置知识笔记正文一、ES数据预处理1.1 Ingest Node&#xff1a;摄入节点1.2 Ingest Pipeline&#xff1a;摄入管道1.3 Processor&#xff1a;预处理器——简单加工1.4 Painless Script&#xff1a;脚本——复杂加工1.5 简单实用案例 二、文档/数据…

C语言——从键盘任意输人一个三位数的自然数,求该数个位、十位、百位上的数字之和

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i,ge,shi,bai;printf("输入一个三位数整数&#xff1a;\n");scanf("%d",&i);gei%10; //个位shii%100/10; //十位baii/100; //百位printf("个位:%d,十位:%d,百位:…