排序(一)——冒泡排序、直接插入排序、希尔排序(BubbleSOrt,InsertSort,ShellSort)

news2024/9/20 1:28:38

        欢迎来到繁星的CSDN,本期的内容主要包括冒泡排序(BubbleSort),直接插入排序(InsertSort),以及插入排序进阶版希尔排序(ShellSort)。

        废话不多说,直接上正题!

一、冒泡排序

        冒泡排序是我们的老朋友了,我们最初模拟实现qsort的时候就是用它来模拟的(尽管qsort的底层原理实际是quicksort,即快排)。

        上代码!

void BubbleSort(int* a, int n)
{
	for (int j = 0; j < n; j++)
	{
		// 单趟
		int flag = 0;
		for (int i = 1; i < n - j; i++)
		{
			if (a[i - 1] > a[i])
			{
				Swap(&a[i - 1], &a[i]);
				flag = 1;
			}
		}

		if (flag == 0)
		{
			break;
		}
	}
}

        代码相当简单,其思想就是通过两两之间的比较,每一趟都将最大的数据放在数组的最后

        缺点是,冒泡排序的速度相当慢,原因不仅仅在于比较的次数恒定(n*(n+1)/2次),更在于如果数据量庞大,各个数据移动的速度也相当慢。

        实际意义聊胜于无,但却很好地帮我们入门各大排序算法,这是它仍然活跃的意义。

     二、直接插入排序

       我们一般会叫它插入排序,在此加入“直接”二字,是为了区分它和希尔排序。

        插入排序的思路也是较为简单的。

        面对一个有n个元素的数组,如果前n-1个元素都有序,那么第n个元素通过和前面所有元素比较,就能得到该元素在数组中的位置。有一点数学归纳法的思想在里面。

        上代码!

void InsertSort(int* a, int n)
{
	//  [0, n-1]
	for (int i = 0; i < n - 1; i++)
	{
		// [0, n-2]是最后一组
		// [0,end]有序 end+1位置的值插入[0,end],保持有序
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
				--end;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

        由于一个元素一定有序,所以第一个元素不用排序。而从第二个元素开始,通过比较,不断插入到前面的数组中,使前n项都有序,如此往复,便可使得整个数组有序。

        相比于冒泡排序,插入排序少了大量重复的交换数值的工作,而是一步到位,得到数据的最终位置(尽管时常需要将所有数据后移,但代码中只是赋值,而非交换,效率比冒泡高的多)。

        两者运行时间差别:

        

        (此处数据为10000个)

        尽管如此,我们在实际工作中也很少使用直接插入排序,即使时间比冒泡排序少的多,其时间复杂度仍为O(n^2)。但不得不指出,它仍有应用,后续在快排的时候将会提到。

三、希尔排序

        

        希尔排序是插入排序的优化版本,优化到可以和快速排序一较高下。

        希尔排序主要做两件事:1、预排序。2、插入排序。

        由插入排序的代码可知,当数组越趋近于有序,比较和赋值的次数也越来越少。所以预排序的目的就是使得整个数组接近有序。

        上代码!

void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		// +1保证最后一个gap一定是1
		// gap > 1时是预排序
		// gap == 1时是插入排序
		gap = gap / 3 + 1;

		for (size_t i = 0; i < n - gap; ++i)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}

        要点解释:

1、gap代表的含义是,下标相减为gap的元素为一组,进行插入排序。此举的意义是使得O(n^2)的复杂度造成的影响尽可能小,因为a*(n/a)^2小于n^2,a为任意整数。

2、而当gap等于1时再进行排序,就是插入排序了。

3、gap的大小实际上由写代码的人自己决定,没有一定gap越大,或者gap越小的效果最好,但可以确定的是,经过预排序的插排会比直接插排要更快。

4、上述代码中的gap是一个效果较好的gap,可以参照并直接使用。

        本篇内容到此结束,谢谢大家的观看!

        觉得写的还不错的可以点点关注,收藏和赞,一键三连。

        我们下期再见~

        往期栏目:

        一文带你入门二叉树!-CSDN博客

        栈和队列的介绍与实现-CSDN博客

        设计扫雷游戏_扫雷游戏设计-CSDN博客

        

        

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

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

相关文章

国漫推荐04

童年经典 1.《喜羊羊与灰太狼》 2.《虹猫蓝兔七侠传》 3.《虹猫蓝兔走天涯》 4.《虹猫蓝兔光明剑》 5.《蓝猫龙骑团》 6.《爆丸小子》 7.《超智能足球》 8.《摩尔庄园》 9.《赛尔号》 10.《恐龙宝贝》 11.《天上掉下个猪八戒》 12.《天眼》

tk 设置文本颜色

import tkinter as tk from tkinter import messageboxdef change_text_color(color):# 获取选中的文本范围start_index text_widget.tag_ranges(tk.SEL)if start_index:# 如果文本被选中&#xff0c;只改变选中文本的颜色tag_name f"color_{color}"# 移除选中文本…

Internet Download Manager V6.43被用15天 怎么激活IDM

互联网下载管理器是一个广泛使用的软件&#xff0c;它可以帮助用户更好地管理和加速他们的下载。最新版本Internet Download Managerv6.43已经发布&#xff0c;它带来了一系列新功能和改进&#xff0c;让用户更加方便和快速地下载他们需要的文件。 新版本Internet Download Ma…

通过手机供网、可修改WIFI_MAC的网络设备

一、修改WIFI mac&#xff08;bssid&#xff09; 取一根网线&#xff0c;一头连着设备黄色网口、一头连着电脑按住设备reset按键&#xff0c;插入电源线&#xff0c;观察到蓝灯闪烁后再松开reset按键 打开电脑浏览器&#xff0c;进入192.168.1.1&#xff0c;选择“MAC 地址修改…

书生大模型实战营-入门第2关-python单词计数

python单词计数 统计单词数量 统计单词数量 统计单词数量&#xff0c;拆分为以下几步&#xff1a; 需要剔除文本中的标点符号与换行符大小写转换单词拆分计数 详细代码如下&#xff1a; import redef wordcount(text):"""单词计数标点去除大小写转换"&…

Java版Flink使用指南——背压

大纲 新建工程模拟函数自定义无界流背压测试引入数据低压侧高压侧测试结果 优化降低算法复杂度提高并行度 工程代码 背压&#xff08;Backpressure&#xff09;又称“反压”&#xff0c;是指在Flink的处理过程中&#xff0c;某个过程出于某种原因&#xff0c;消耗的上游数据过慢…

分析逆向案例十三——拍拍贷登录密码逆向和JS原型链

网址&#xff1a;拍拍贷 登陆页面&#xff0c;找登陆包&#xff0c;密码和用户名都进行了加密。 直接参数搜索 &#xff0c;一眼下面的第二条&#xff0c;直接点击进入 加密位置打上断点分析&#xff0c;一个加密嵌套另一个加密。 中间的e.md5好像是md5加密&#xff0c;打印一…

windows系统上python3安装open3d第三方库

打开命令提示符&#xff0c;输入&#xff0c; pip install open3d -i https://pypi.tuna.tsinghua.edu.cn/simple成功页面&#xff0c;

百度安全大模型智能体实践入选信通院“安全守卫者计划”优秀案例

7月3日&#xff0c;由全球数字经济大会组委会主办&#xff0c;中国信息通信研究院&#xff08;以下简称中国信通院&#xff09;与中国通信标准化协会联合承办的2024全球数字经济大会“云和软件安全论坛暨第二届SecGo云和软件安全大会”在北京召开。本届论坛聚焦云和软件安全最新…

【Stable Diffusion】(基础篇三)—— 图生图基础

图生图基础 本系列笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 本文主要讲解如何使用S…

线性系统理论及应用GUI设计及仿真

目录 1.控制系统的状态空间模型 1.1.状态空间模型 1.2 传递函数模型 1.3 传递函数转换为状态空间模型 1.4.状态空间模型转换为传递函数 1.5.状态空间模型转化为约当标准型 2.线性系统的时域分析 2.1.矩阵指数函数的计算 2.2.线型定常连续系统的状态空间模型求解 3.线…

java后端项目启动失败,解决端口被占用问题

报错信息&#xff1a; Web server failed to start . Port 8020 was already in use. 1、查看端口号 netstat -ano | findstr 端口号 2、终止进程 taskkill /F /PID 进程ID 举例&#xff1a;关闭8020端口

Echarts 实现空心圆的绘制

文章目录 需求分析在指定位置绘制需求 如图所示,绘制空心圆 分析 <!DOCTYPE html> <html><head><meta charset=

dive deeper into tensor:从底层开始学习tensor

inspired by karpathy/micrograd: A tiny scalar-valued autograd engine and a neural net library on top of it with PyTorch-like API (github.com)and Taking PyTorch for Granted | wh (nrehiew.github.io). 这属于karpathy的karpathy/nn-zero-to-hero: Neural Networks…

【数据结构】深入理解哈希及其底层数据结构

目录 一、unordered系列关联式容器 二、底层结构 2.1 哈希的概念 2.2 哈希冲突&#xff08;哈希碰撞&#xff09; 2.3 哈希函数 2.4 哈希冲突处理 2.4.1 闭散列&#xff08;开放定址法&#xff09; 2.4.1.1 代码实现&#xff1a; 2.4.2 开散列&#xff08;链地址法&…

利用视频识别做一个土粒实时监测系统

要利用视频识别技术构建一个土粒实时监测系统&#xff0c;我们可以参考以下方案&#xff0c;该方案结合了计算机视觉、深度学习以及相关技术的要点。 一、系统概述 土粒实时监测系统基于先进的视频识别技术&#xff0c;旨在实现对土壤颗粒的实时、准确监测。该系统可以应用于…

Android启动优化之精确测量启动各个阶段的耗时

1. 直观地观察应用启动时长 我们可以通过观察logcat日志查看Android应用启动耗时&#xff0c;过滤关键字"Displayed"&#xff1a; ActivityTaskManager: Displayed com.peter.viewgrouptutorial/.activity.DashboardActivity: 797ms 启动时长(在这个例子中797ms)表示…

水库大坝安全监测险情主要内容

水库常见险情主要包括洪水漫顶、脱坡滑坡、坝体裂缝、 散浸、渗漏、漏洞、陷坑、管涌等&#xff0c;此外风浪冲击、水流冲刷等也会加剧险情的扩大。大坝险情万一抢护不及时&#xff0c;易导致发 生溃坝事故&#xff0c;造成极为严重的灾难性后果。要做到及时有效地 抢护大坝险情…

智慧金融-数据可视化

智慧金融-数据可视化 导入所需的库 import numpy as np import numpy_financial as npf import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams[font.sans-serif][FangSong] mpl.rcParams[axes.unicode_minus]False单图曲线图 r 0.05 # 贷款的年利率 n 30…

28.IP核理论知识(Xilinx)

&#xff08;1&#xff09;ip核是什么&#xff1f; IP&#xff08;Intellectual Property&#xff09;即知识产权&#xff0c;在半导体产业中&#xff0c;将IP核定义为“用于ASIC或FPGA中的预先设计好的电路功能模块”&#xff0c;简而言之&#xff0c;这里的IP即电路功能模块。…