(1)冒泡排序和其优化

news2024/9/22 5:24:41

一 冒泡排序

在这里插入图片描述

1.1 冒泡排序概念

冒泡排序(Bubble Sort)是一种交换排序,基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录位置。

假设要对无序数列{2,3,4,5,6,7,8,1}排序:

冒泡排序规律:每一轮排序两两比较都会把最大的值移动到最后一位,最大值就像在不断的冒泡一样。

1.2 冒泡算法

func BubbleSort(arr []int) {

	if arr == nil || len(arr) < 2 {
		fmt.Println("数组不满足要求")
		return
	}

	// 外层循环:确定扫描的次数
	for i := 1; i <= len(arr) - 1; i++ {
		// 内层循环:一轮扫描内,两两比较,进行交换
		for j := 0; j <= len(arr) - 1 - i; j++ {	 // - i 的原因是后面的元素已经被排序过
			if arr[j] > arr[j + 1] {
				temp := arr[j]
				arr[j] = arr[j + 1]
				arr[j + 1] = temp
			}
		}
	}
}

1.3 冒泡算法优化

如果要排序的数据序列已经完全有序了,那么冒泡算法仍然会按照两两比较策略继续走下去,这是不能容忍的,我们可以先记录该数据序列是否有序,只要内层循环没有发生交换,就证明整个数组现在已经有序,无需外层循环再次排序!

func BubbleSort(arr []int) {
	if arr == nil || len(arr) < 2 {
		fmt.Println("数组不满足要求")
		return
	}
	isSorted := false
	for i := 1; i <= len(arr)-1; i++ {
		isSorted = true
		for j := 0; j < len(arr)-1-i; j++ {
			if arr[j] > arr[j+1] {
				temp := arr[j+1]
				arr[j+1] = arr[j]
				arr[j] = temp
				isSorted = false
			}
		}
		if isSorted {
			break
		}
	}
}

1.4 冒泡排序优化二

显然数据的完全有序概率是很低的,但是数据局部有序的情况概率还是很高的。如果如果最后几个元素都已经是排好的,那么这几个局部有序的数据就无需进行冒泡排序了,如:arr := []int{3, 2, 4, 1, 6, 0, 5, 7, 8, 9}。在1.3优化一的基础上,我们可以通过记录最后一次排序比较的索引,来继续优化:

func BubbleSort(arr []int) {

	if arr == nil || len(arr) < 2 {
		fmt.Println("数组不满足要求")
		return
	}

	isSorted := false
	sortIndex := len(arr) - 1 - 1
	lastIndex := 0 // 记录最后一次交换的位置
	for i := 1; i <= len(arr)-1; i++ {
		isSorted = true
		for j := 0; j <= sortIndex; j++ {
			if arr[j] > arr[j+1] {			// 不能加入等号,这样会造成不稳定
				temp := arr[j]
				arr[j] = arr[j+1]
				arr[j+1] = temp
				isSorted = false
				lastIndex = j
			}
		}
		if isSorted {
			break
		}
		sortIndex = lastIndex
	}
}

二 冒泡排序复杂度分析

  • 最好情况:数据本身是有序的,那么其时间复杂度应该是O(n)
  • 最坏情况:表中所有的元素都是逆序的,时间复杂度为O(n^2)。

三 扩展:鸡尾酒排序

冒泡排序的每一轮都是从左到右比较,进行单向的位置交换。鸡尾酒排序则可以让比较和交换的过程是双向的。

对1.1图中的序列进行冒泡排序会造成大量浪费,鸡尾酒排序则很容易实现:

也就是说鸡尾酒的排序过程像钟摆一样,奇数轮和偶数轮来回排序,第1轮从左往右,第2轮从右往左,第3轮再从左往右,直到有一轮排序时没有发生交换,则退出循环。

我们也不难发现:当一个无需数列中,大多元素都有序的时,使用鸡尾酒排序则能达到很好的效果。

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

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

相关文章

从一到无穷大 #34 从Columnar Storage Formats评估到时序存储格式的设计权衡

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言Parquet / ORC功能与结构对比差异Indexes and Filters压缩影响 TsFile总结 引言 …

使用 Milvus Lite、Llama3 和 LlamaIndex 搭建 RAG 应用

大语言模型&#xff08;LLM&#xff09;已经展示出与人类交互并生成文本响应的卓越能力。这些模型可以执行各种自然语言任务&#xff0c;如翻译、概括、代码生成和信息检索等。 为完成这些任务&#xff0c;LLM 需要基于海量数据进行预训练。在这个过程中&#xff0c;LLM 基于给…

捷达千里江山首发亮相,捷达品牌2024成都车展继续宠粉不停

2024年8月30日&#xff0c;捷达品牌携新车捷达千里江山惊艳亮相2024成都国际车展&#xff0c;并在五周年之际&#xff0c;发布幸福包油计划等宠粉福利&#xff0c;号召用户打卡千里江山&#xff0c;奔赴美好。与此同时&#xff0c;全新捷达VS5/VS7五周年纪念版车型进一步降低了…

基于Java+SpringBoot+Vue的汽车销售网站

基于JavaSpringBootVue的汽车销售网站 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345; 某信 gzh 搜索【智能编程小助手】获取项…

Kevin‘s notes about Qt---Episode 3 在界面中修改程序参数Demo

Demo 效果 实现一个加法器,在输入框中分别填入a和b的值,点击“calculate”按钮,在sum处显示a+b的结果。 整体结构 我自己先写了一个模板用于测试从文本框获取输入数据,整个工程的结构如下: 说明: func_myself.h和func_myself.cpp是我自己创建的头文件和源文件,用于定…

江协科技stm32————11-2 W25Q64简介

W25Q64简介 存储容量&#xff08;24位地址&#xff09;在分配地址时需要3个字节&#xff0c;最多16MByte 硬件电路 HOLD&#xff1a;相当于SPI进了一次中断&#xff0c;保持原来的数据 括号内的IO0、IO1……用于双重和四重SPI 框图 右上角首先将8Mb的存储空间以64kb的大小分为…

创新大赛决赛:如何让你的项目更上一层楼?

创新大赛决赛&#xff1a;如何让你的项目更上一层楼&#xff1f; 前言突出项目的核心价值指导老师的辅导作用制作优秀的PPT演讲和答辩的准备利用数据和案例增强说服力模拟答辩的重要性总结结语 前言 在当今这个快速变化的时代&#xff0c;创新不仅是推动社会进步的动力&#xf…

R语言 | 文件读取

一、文件读取 -scan()函数 scan(file “”, what double(), nmax -1, n -1, sep “ ”)&#xff0c;file" " 的双引号里写文件地址&#xff0c;what写读入的数据类型&#xff0c;如果文件有好几种类型&#xff0c;可以啥也不写&#xff08;what" "&…

数据结构与算法——Java实现 3.二分查找——Java版

放下不切实际的幻想&#xff0c;放下无法更改的过去&#xff0c;行云流水&#xff0c;任其行之 —— 24.8.31 一、二分查找——Java基础版 Java中的API——Arrays.binarySearch(数组&#xff0c;目标值) 返回的结果是插入点的位置 若在目标数组中找不到元素&#xff0c;则返…

折叠cell的学习

折叠cell 文章目录 折叠cell前言示例代码部分实现思路核心内容 前言 笔者在暑假的3GShare的项目中就写了有关折叠cell的内容&#xff0c;这里笔者重新讲一下相关内容。 示例 这里先给出效果图&#xff0c;这里是我们的折叠cell的最后的实现效果&#xff0c;下面来讲解一下相关代…

linux 云主机 pip 安装配置 letsencrypt certbot 为多个域名生成免费 https 证书实录

本文记录了我在华为云 EulerOS linux 云主机使用 python pip 方式安装配置 Let’s Encrypt certbot, 并为我的网站的多个域名生成免费 https 证书的整个过程, 包括 python 环境配置, 下载 certbot 及 certbot-nginx, 一次性生成多个域名的证书及注意事项, 以及最后配置 certbot…

k3s中使用GPU资源

前提是已经安装了nvidia驱动 一、安装nvidia-container-toolkit&#xff08;推荐&#xff09; #复制一份docker配置文件,以防被覆盖 cp /etc/docker/daemon.json /etc/docker/daemon.json.bak #安装NVIDIA Container Toolkitapt-get install nvidia-container-toolkit二、配置…

Python 数据分析笔记— Numpy 基本操作(上)

文章目录 学习内容&#xff1a;一、什么是数组、矩阵二、创建与访问数组三、矩阵基本操作 学习内容&#xff1a; 一、什么是数组、矩阵 数组&#xff08;Array&#xff09;&#xff1a;是有序的元素序列&#xff0c;可以是一维、二维、多维。 array1 [1,2,3] 或[a, b, c, d…

如何通过住宅代理进行高效SSL检查

引言 什么是SSL检查&#xff1f;有哪些内容&#xff1f; 为什么要使用SSL检查&#xff1f; SSL检查是如何进行的&#xff1f; 总结 引言 在现代互联网环境中&#xff0c;SSL/TLS协议已成为确保网络通信安全的基石。随着网络攻击手段的不断演进&#xff0c;仅仅依赖于基础的…

[Leetcode 47][Medium]-全排列 II-回溯(全排列问题)

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 和上一道Leetcode46相比&#xff0c;有变化的地方是要排除重复组合的情况。那么在组合问题中去除重复组合的方法是先对数组进行排序,然后在回溯函数中判断当前元素与上一个元素是否相同,若相同…

Kotaemon:开源的RAG UI

检索增强生成 (RAG) 已成为一种改变游戏规则的方法&#xff0c;可增强大型语言模型的功能。Kotaemon 是由 Cinnamon 开发的开源项目&#xff0c;它站在这项创新的最前沿&#xff0c;提供了一个简洁、可定制且功能丰富的基于 RAG 的用户界面&#xff0c;用于与文档聊天。 Kotae…

【再回顾面向对象】,关键字Satic、final

再回顾面对对象 object&#xff1a;所有类的祖先&#xff0c;所有类的方法 GC&#xff1a;垃圾回收站 一般不会回收对象——Car c new Car(); toString() Hashchde要跟地址对应 尽量不要自己产生跟指针不一样&#xff0c;指针是直接指向地址像是数组的索引找的时候可能会有…

AcWing 902. 最短编辑距离

视频讲解&#xff1a; 【E07 线性DP 编辑距离】 两套代码的字符串存储数组都是从1开始存储的&#xff01;&#xff01;&#xff01;&#xff01; 硬套公式&#xff1a; #include<iostream> #include<algorithm> const int N 1010; using namespace std; int …

文心快码前端工程师观点分享:人机协同新模式的探索之路(一)

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; 本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站1…

mysql基础练习题 1082.销售分析1 (力扣)

1082.编写解决方案&#xff0c;找出总销售额最高的销售者&#xff0c;如果有并列的&#xff0c;就都展示出来。 题目链接&#xff1a; https://leetcode.cn/problems/sales-analysis-i/description/ 建表插入数据&#xff1a; Create table If Not Exists Product (product…