【数据结构】简单排序:冒泡、选择、插入

数据结构与算法:冒泡排序、插入排序、选择排序 排序算法太多了,有很多可能你连名字都没听说过,比如猴子排序、睡眠排序、面条排序等。我只讲众多排序算法中的一小撮,也是最经典的、最常用的:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。按照时间复杂度把它们分成了三类,本文先分析冒泡、插入、选择三种排序算法 排序算法 时间复杂度 是否基于比较 冒泡、插入、选择 O(n²) √ 快排、归并 O(nlongn) √ 桶、计数、基数 O(n) × 带着问题去学习,是最有效的学习方法。所以按照惯例,我还是先给你 阅读详情

简单排序

冒泡排序

原理

  1. 比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。
  2. 对每一对相邻元素做同样的工作,从开始第一对元素到结尾的后一对元素。终后位置的元素就是大值。
    BubbleSort

代码实现

public class BubbleSort {
	
	public static void sort(Comparable[] a) {
		for(int i = 0;i<a.length-1;i++) {
			for(int j = 0;j<a.length-1-i;j++) {
				if(greater(a[j],a[j+1])) {
					exchange(a,j,j+1);
				}
			}
		}
	}
	
	private static boolean greater(Comparable a,Comparable b) {
		return a.compareTo(b)>0;
	}
	
	private static void exchange(Comparable[] a,int i,int j) {
		Comparable tmp;
		tmp = a[i];
		a[i] = a[j];
		a[j] = tmp;
	}
}

主类

package p_01;

import java.util.Arrays;

import p_02.*;



public class Main {

	public static void main(String[] args) {
		
		Integer a[] = {4,3,2,10,12,1,5,6};
		
		Shell.sort(a);
		
		System.out.println(Arrays.toString(a));
		
	

	}

}

时间复杂度

冒泡排序使用了双层for循环,其中内层循环的循环体是真正完成排序的代码,所以, 我们分析冒泡排序的时间复杂度,主要分析一下内层循环体的执行次数即可。
在坏情况下,也就是假如要排序的元素为{6,5,4,3,2,1}逆序,那么:
元素比较的次数为:

(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;
元素交换的次数为:

(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;
总执行次数为:

(N2/2-N/2)+(N2/2-N/2)=N^2-N; 按照大O推导法则,保留函数中的高阶项那么终冒泡排序的时间复杂度为O(N^2).

选择排序

原理

  1. 每一次遍历的过程中,都假定第一个索引处的元素是小值,和其他索引处的值依次进行比较,如果当前索引处 的值大于其他某个索引处的值,则假定其他某个索引出的值为小值,后可以找到小值所在的索引。
  2. 交换第一个索引处和小值所在的索引处的值。

Selection

代码实现

public class Selection {
	
	public static void  sort(Comparable[] a) {
		for(int i = 0;i<=a.length-2;i++) {  //只剩最后一个元素就不用排序了,所以是a.length-2
			int minIndex = i;
			for(int j=i+1;j<a.length;j++) {
				if(greater(a[minIndex],a[j])) {  //当前最小值比当前值大,需要交换。
					minIndex = j;
				}
			}
			exchange(a,i,minIndex);
		}
	}

比较函数和交换函数都和冒泡排序的一样,这里不再重复。后面的没有特别说明的话同上。
测试用的主类只需要改一下调用的函数就可,也不再重复。

时间复杂度分析

选择排序使用了双层for循环,其中外层循环完成了数据交换,内层循环完成了数据比较,所以我们分别统计数据 交换次数和数据比较次数:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;

数据交换次数:
N-1
时间复杂度:N2/2-N/2+(N-1)=N2/2+N/2-1;
根据大O推导法则,保留高阶项,去除常数因子,时间复杂度为O(N^2);

插入排序

原理

  1. 把所有的元素分为两组,已经排序的和未排序的;
  2. 找到未排序的组中的第一个元素,向已经排序的组中进行插入;
  3. 倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,那么就把待 插入元素放到这个位置,其他的元素向后移动一位;

在这里插入图片描述

代码实现

public class Insertion {

	public static void sort(Comparable[] a) {
		for(int i=1;i<a.length;i++) {
			for(int j=i;j>0;j--) {
				if(greater(a[j-1],a[j])) {
					exchange(a,j-1,j);
				}else {
					break;
				}
			}
		}
	}

时间复杂度分析

插入排序使用了双层for循环,其中内层循环的循环体是真正完成排序的代码,所以,我们分析插入排序的时间复 杂度,主要分析一下内层循环体的执行次数即可。
坏情况,也就是待排序的数组元素为{12,10,6,5,4,3,2,1},那么:
比较的次数为:

(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;
交换的次数为:

(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;
总执行次数为:
(N2/2-N/2)+(N2/2-N/2)=N^2-N;
按照大O推导法则,保留函数中的高阶项那么终插入排序的时间复杂度为O(N^2).

[官方培训]22-UE资产优化 Epic 肖月 笔记 Nanite+Lumen目标:面向TA,美术,不影响视觉的前提下,优化运行和编辑效率引擎:UE5.1延迟管线平台:主流PC,Windows 10 with DX12。 阅读详情

相关推荐

CAN通信:EB中配置CAN驱动,配置参数解析

以S32K314芯片说明,其他芯片不同,参数配置也有差异。

zhangxiaio1的博客 2173

【数据结构与算法】简单排序(冒泡排序、选择排序、插入排序)完整思路,并用代码封装排序函数

之前的文章,我已经把前端需要了解的数据结构都给说了一边,并且我们也都对其进行了封装。现在我们要开始对排序算法部分进行讲解,排序算法顾名思义,就是对一堆杂乱无章的数据按照一定的规则将它们有序地排列在一起。 在讲解排序算法时,大致分成两大类,如下图 本文

零一的博客 2万+

Office LTSC 2021/2024专业部署:ODT+config.xml标准化实战

Office部署本质上是企业终端软件生命周期管理的关键环节,其核心原理在于通过声明式配置驱动安装、激活与组件裁剪。Office Deployment Tool(ODT)作为微软官方命令行引擎,配合config.xml这一DSL契约文件,实现可版本控制、可审计、可回滚的自动化交付。该方案技术价值突出体现在稳定性保障(如LTSC长期支持通道)、合规性强化(不绕过授权机制)及运维提效(批量部署、离线支持)。典型应用场景覆盖教育机房批量装机、政企终端标准化、医疗HIS工作站部署等对功能冻结与系统确定性要求严苛的环境

diaocuiguo2493的博客 561

数据结构 | 算法精讲:‘直接插入排序、冒泡排序、简单选择排序

设有关键字序列{7,4,-2,19,13,6},为了方便理解,我们把序列用两个中括号隔开,前面的中括号包含的是已经排好序的序列,后面的中括号包含无序序列。依次比较相邻的两个记录的关键字,若两个记录是反序的(即前一个记录的关键字大于后前一个记录的关键字),则进行交换,直到没有反序的记录为止。进行第一趟排序时,7是有序序列,4是无序序列的首元素,也是第一次排序的待排元素,我们用它和有序序列的末元素开始依次比较。因为4比7小,所以7向后移动一个单位,前面没有元素了,4插入到7的前面,比较结束。

qq_69383479的博客 2177

【操作系统】 Operation System 第二章:操作系统基础操作

2.1 操作系统的启动 (1)CPU, I/O, 内存通过总线连接。 (2)DISK:存放OS; BIOS:基本I/O处理系统( basic I/O system); Bootloader: 加载OS到内存中。 (3)当电脑通电时,段寄存器CS和指令寄存器IP能够确定一个内存地址,例如CS:IP = 0xf000:fff0. (4)POST(加电自检),寻找显卡和执行BIOS。(显示器,键盘…是否...

iwanderu的博客 1万+

Nvidia AGX Xavier刷机指北

因为工作的关系,要在AGX上安装CUDA。nvidia官网上没找到适合AGX版本的CUDA,只能走刷机的路子。刷机过程中,也遇到一些坑,做个记录。 需要有一台ubuntu系统的电脑作为主机Host。我的主机系统为Ubuntu18.04 整个刷机过程为: 在Host上安装sdkmanager,整个刷机过程主要通过sdkmanager来操作。 在Host自动下载一些系统组件,各种deb包 Host上制作OS系统镜像,烧录到AGX中 Host上之前下载好的deb包,安装到AGX中。 完结,撒花 ...

sinat_38685124的博客 6296

(九)数据结构之简单排序算法实现:冒泡排序、插入排序和选择排序

1、冒泡排序 /* 冒泡排序,按照由小到大顺序进行排序 */ void Bubble_Sort( ElementType A[], int N ) { int P, i; int flag = 0; /* 定义一个flag来判断带排序序列是否有序或局部有序,提高算法效率 */ for ( P=N-1; P>=0; P-- ) { flag = 0; for( i=0; i<P;

TECH_PRO的博客 1409

YOLOv11改进 | 添加注意力篇 | 结合2024最新Mamba注意力机制MLLA助力yolov11有效涨点含二次创新C2PSA(全网独家首发改进)

本文给大家带来的改进机制是结合号称超越Transformer架构的Mamba架构的最新注意力机制MLLA,本文将其和我们YOLOv11进行结合,的原理是通过将Mamba模型的一些核心设计融入线性注意力机制,从而提升模型的性能。具体来说,MLLA主要整合了Mamba中的“忘记门”(forget gate)和模块设计(block design)这两个关键因素,同时MLLA通过使用位置编码(RoPE)来替代忘记门,从而在保持并行计算和快速推理速度的同时,提供必要的位置信息。

Snu77的博客 3870

数据结构——排序算法(简单篇:冒泡排序、选择排序、插入排序)

算法最好时间最坏时间稳定性空间复杂度适用场景冒泡排序O(n)O(n²)稳定O(1)数据量小,且大致有序选择排序O(n²)O(n²)不稳定O(1)数据量小,对交换次数敏感插入排序O(n)O(n²)稳定O(1)数据基本有序,小规模排序。

xcnn_的博客 1061

黑猫带你学Nand第8篇:NandFlash的供电情况详解

是指在任何工作条件下,设备允许的最大电压、电流、功率以及温度等参数的界限值。

黑猫奥利奥的博客 1150

深度强化学习 | 详解基于价值的强化学习DQN算法(附Pytorch实现)

深度Q网络DQN的核心原理是通过经验回放池和目标网络技术拟合高维状态空间,是Q-Learning算法的深度学习版本,本文分析DQN的基本算法,并给出训练实例和实际案例

FRIGIDWINTER的博客 4987

常用数据结构算法:简单排序方式(冒泡,选择,插入)

  所谓的简单排序方式就是时间复杂度相对于一些高级排序方式较高的排序方式(简单排序的时间复杂度一般都是 O(N2)),但是其实现简单,并且思路比较清晰,在本文当中,简单介绍三种简单排序方式,包括经典的冒泡排序、选择排序、还有插入排序。   首先介绍插入排序,其实现思路是:默认当前待排序的位置的左边是已经排序好的数组,然后将当前位置与左边排序好的数组元素逐一比较,找到当前待排序的元素所应...

137

极智嘉嵌入式面试题及参考答案

IIC(Inter-Integrated Circuit)即集成电路总线,是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它仅使用两根线,即串行数据线 SDA 和串行时钟线 SCL,就能实现多个设备之间的通信,具有简单、高效、占用资源少等优点,广泛应用于各种嵌入式系统中。

大模型大数据攻城狮的专栏 922

《数据结构与算法》(二十一)- 简单排序算法详解:冒泡、简单选择、直接插入

目录前言1. 排序的基本概念与分类1.1 排序的稳定性1.2 内排序与外排序1.3 排序用到的结构与函数2. 冒泡排序2.1 最简单排序的实现2.2 冒泡排序算法2.3 冒泡排序优化2.4 冒泡排序复杂度分析3. 简单选择排序3.1 简单选择排序算法3.2 简单选择排序复杂度分析4. 直接插入排序4.1 直接插入排序算法4.2 直接插入排序复杂度分析5. 总结 前言 部分内容摘自程杰的《大话数据结构》 1. 排序的基本概念与分类   排序是我们生活中经常会面对的问题。同学们做操时会按照从矮到高排列;老师查

程序园@大Null 1740

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JAVA数据结构:简单排序(冒泡,选择,插入)

1.冒泡排序. 每次比较相邻两个数据,如果第一个大于第二个,就交换顺序. 这样一趟下来最大的数据就在最右边. 对所有的数据进行第一趟排序后,进行了N-1次比较,进行了最少0次,最多N-1次交换这个算法的思路是要将最小的数据项放在数组的最开始(0位置),并将最大的数据项放到最后(N-1位置).外循环的计算器out从数组的最后开始,每经过一次循环out-1,下标大于out的都是排好了,out在完成

Dreams of JAVAD 683

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

基础数据结构及算法:简单排序算法,包括选择排序、插入排序、冒泡排序

文章目录1. 测试框架2. 选择排序3. 插入排序4. 冒泡排序 1. 测试框架 完成功能: 输入数字n,生成n个 0~n 的随机数 使用qsort升序排序 如果数据为升序则输出1,否则为0 #include <stdio.h> #include <time.h> #include <stdlib.h> #include <stdbool.h> void Random(int* arr,int n){ srand(time(NULL));

凯凯在此 300

Java数据结构和算法-3-数组-简单排序:冒泡排序/选择排序/插入排序

前面我们介绍了线性查找和二分查找,二分查找之前,我们需要进行对数组元素排序。本篇就是介绍三个简单的排序,分别是冒泡排序,选择排序,插入排序。可以说说,面试之前,这三个排序算法都是需要复习,哪怕背下来,并且解释出代码的含义和原理。 1、冒泡排序 这里我们新建一个BubbleSort.java用来写冒泡排序,代码如下 package array; public class BubbleSor...

Anthony_tester的博客 875

数据结构八大排序中的四大简单排序:直接插入排序、选择排序、基数排序和冒泡排序

四大简单排序算法是学习更复杂算法的基础,并且4种简单排序都是以双重for循环为核心,直接插入排序:小数据量、基本有序数据选择排序:小数据量、交换次数少的场景基数排序:整数、字符串排序,稳定且高效冒泡排序:教学演示、小数据量稳定排序掌握这些基础排序算法不仅有助于理解算法设计思想,也为大家学习更高级的排序算法打下坚实基础。在实际应用中,应根据具体需求选择合适的排序算法。

2301_78626750的博客 854

Java数据结构与算法-读后感01(简单排序:冒泡,选择,插入)

第三章:关于一些简单排序的比较和代码 简单排序中分为4种类型:   1.冒泡排序(这个想必是各位非常熟悉,平时也接触得比较多的)   2.选择排序   3.插入排序 1.冒泡排序   一般来说,数组中如果有N个数据项,则第一趟排序中有N-1次比较,第二趟有N-2次,依次类推后其序列的求和公式为:   (N-1)+(N-2)+(N-3)+...+1 = N*(N-1)/...

dilianzhuo1928的博客 145

数据结构与算法之--简单排序:冒泡、选择和插入

三种简单排序算法   排序是最常见的算法,本文将介绍三种简单排序算法:冒泡,选择和插入排序。三种算法基本都在数组内部操作数据,所以空间复杂度为O(N),时间复杂度都为O(N^2),需要说明的是,虽说时间复杂度均为O(N^2),但具体来说,O(N^2)仅仅是指用于数据值比较次数的量级,但是交换和拷贝数据的次数是不同的,所以三种排序算法的性能在这里有重要区别。 说明:为了描述方便,以下...

weixin_30807779的博客 130

数据结构基础7.1:简单排序(冒泡、选择、插入)

简单排序有三种:冒泡排序、选择排序、插入排序。 1.冒泡排序(这里介绍两种方式): A.代码如下: void Bubble_sort1(int a[], int n) { int i, j, flag, temp; for(i = n - 1; i > 0; i--) { flag = 0; for(j = 0; j < i; j++) {

u010815257的博客 352

数据结构八大排序详解(一):四大简单排序(冒泡/选择/插入/希尔)

在数据结构与算法体系中,排序是最基础、最高频的核心模块,几乎所有后端开发、算法刷题、数据分析场景都离不开排序。简单来说,排序就是将一组无序的数据序列,按照从小到大(升序)或从大到小(降序)的规则,重新整理为有序序列的过程。日常开发中随处可见排序的应用:电商商品按价格、销量排序,通讯录按姓名排序,后台数据按创建时间排序,刷题时数组预处理有序结构、二分查找前置排序等。掌握排序算法,不仅是应对面试的必备技能,更是理解算法时间、空间优化思维的关键入门。排序算法最好复杂度最坏复杂度平均复杂度空间复杂度。

枕星而眠的博客 643

数据结构&算法Java版(五) 查找、排序算法:折半查找、直接插入排序、折半插入排序、冒泡排序、快速排序、简单选择排序

欢迎关注我的B站账号:卍卍子非鱼卍卍 文章目录查找算法折半查找排序算法直接插入排序折半插入排序冒泡排序快速排序简单选择排序 查找算法 折半查找 /** * 折半查找 * * @param nums 有序数组nums * @param key 目标值key * @return key在nums中的位置(不存在返回-1) */ public int BinarySearch(int[] nums, int key) { int left = 0, right = nums.length

zifeiyu0531的博客 337

【数据结构与算法】排序算法总结:冒泡 / 快排 / 直接插入 / 希尔 / 简单选择 / 堆排序 / 归并排序

内排序的交换排序类别。

qq_30885821的博客 1021

数据结构与算法:冒泡/简单选择/直接插入/堆/归并/快速排序介绍以及代码实现

7类常见排序算法介绍及代码实现 概述: ​ 本文算法实现主要是基于java 语言。介绍了冒泡排序、简单选择排序、直接插入排序、希尔排序、堆排序、归并排序、快速排序等主要排序算法。并在文章的最后对这几类算法做了一个简单的对比。 首先了解几个概念: 排序的稳定性: ​ 对于值相等的两个元素,Ri=Rj,假设排序前Ri位于Rj之前,即i<j ,那么排序后也必须满足Ri位于Rj之前(i<j),并且这样则称排序是稳定的。 内排序与外排序: ​ 内排序是在排序整个过程中,待排序的所有记录全部被放置在内存中。

qq_44887733的博客 1321
下一篇: Spring基本使用
rookiecoder2
博客等级 码龄8年 6粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值