排序算法:插入、希尔、选择、冒泡

news2025/1/4 19:44:04

目录

 一.插入排序

1.算法描述:

2.实现思路:

3.时间复杂度:

代码如下: 

二.希尔排序 (插入排序的优化升级)

1.算法描述:

2.实现思路:

3.时间复杂度: 

代码如下:  

三.选择排序

1.算法思想:

2.实现思路:

3.时间复杂度:

 代码如下:

 四.冒泡排序

1.算法思想:

2.实现思路:

3.时间复杂度:

 代码如下:


一.插入排序

1.算法描述:

假设排为升序,从第二个数据逐次向后遍历,遇到更小的数据时,就将其向后平移。

2.实现思路:

设定两个指针 i 和 q ;i 负责整体数据遍历,q 负责处理遇到更小数据的情况 。

3.时间复杂度:

   O(n^2) 

动态图解析:

代码如下: 

//插入排序
void insersort(int* pq, int k)
{
	for (int i = 1; i < k; i++)           (这里设定从下标为 1 处开始,默认至少两个数据)
	{
		for (int q = i; pq[q] < pq[q - 1]; q--)
		{
			swap(&(pq[q]), &(pq[q - 1]));
		}
	}
}

二.希尔排序 (插入排序的优化升级)

1.算法描述:

假设排为升序,希尔排序的算法思想与插入排序基本一致,都是依次遍历,遇到更小数据向后平移,但是插入排序每次遍历一个数据,我们称之为步长gap 为 1 , 所以当gap为 1 的时候,进行一次插入排序,就能得到我们想要的结果,可是当数据量庞大的时候,gap = 1的情况下,时间成本也随之升高。

所以希尔排序在gap = 1之前进行多次预排序,即引入gap = 6 ;gap = 4; gap = 3等多次插入排序,使得在进行gap = 1的最后一次插入排序前,随着gap 的值越来越接近1 ,原数据已经接近最后的排序结果 ,这样一来,gap = 1的插入排序的时间复杂度由原先的O(n^2),大幅缩减,特殊情况下,甚至可以降到O(n)的效果。

2.实现思路:

设定一个gap,依据原数据量,给定gap 不同的、依次减小的多个值,并以gap 作为步长进行多次插入排序,直至gap = 1的最后一次插入排序的完成。

3.时间复杂度: 

O(n^(1.3-2))

动态图解析:

代码如下:  

//希尔排序
void ShellSort(int* pq,int k )
{
	int gap = (k / 3) + 1;
	for (; gap >= 1;gap = (gap/3)+1)
	{
		int i = 0;
		for (int ki = 0; i < k-gap; i++)
		{
			int temp = pq[i+gap];
			for ( ki = i+gap; ki-gap >= 0; ki -= gap)
			{
				if (pq[ki-gap] < temp)
				{
					pq[ki] = pq[ki-gap];
				}
				else
					break;
			}
			pq[ki] = temp;
		}
		if (gap == 1)
			break;
	}
}

三.选择排序

1.算法思想:

第一次从待排序组中选出最小和最大值分别平移至排序组的首尾(假设排升序)

下一次排序组剔除上一组的最大和最小值,然后重复筛选出最大和最小值,以此类推

2.实现思路:

用两个变量(head,last)控制每次遍历的范围,用变量L进行遍历。

3.时间复杂度:

    O(n^2)

动图解析:

 代码如下:

//选择排序
void SelectSort(int* pq, int k)
{
	int min = 0, max = k - 1;
	int head = 0, last = k-1;
	for (int L = head; head<last;head++,last--)
	{
		L = head;
		for (min = head,max = last; L<=last;L++)
		{
			if (pq[L] < pq[min])
				swap(&pq[min], &pq[L]);
			if (pq[L] > pq[max])
				swap(&pq[max], &pq[L]);
		}
	}
}

 四.冒泡排序

1.算法思想:

将第一个和第二个元素比较,若第一个大于第二个(假设排升序),则交换,然后用第二个(大的)与第三个比较,若第三个大,则交换,以此类推,遍历到最后一个元素时,队尾一定是这组排序数中最大的元素,第二轮排序时将他剔除掉,找出第二大的元素,以此类推。

2.实现思路:

用变量tail 来设定每次遍历的范围,用变量L 来进行前后元素的比较

3.时间复杂度:

O(n^2)

动图解析:

 代码如下:

//冒泡排序
void BubbleSort(int* pq, int k)
{
	int tail = k - 1;
	int L = 0;
	for (; tail>0; tail--)
	{
		for (L = 0; L < tail; L++)
		{
			if (pq[L] > pq[L + 1])
				swap(&pq[L], &pq[L + 1]);
		}
	}
}

感谢观看!!!

 

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

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

相关文章

【算法笔记】最近公共祖先(LCA)问题求解——倍增算法

0. 前言 最近公共祖先简称 LCA&#xff08;Lowest Common Ancestor&#xff09;。两个节点的最近公共祖先&#xff0c;就是这两个点的公共祖先里面&#xff0c;离根最远的那个。 这种算法应用很广泛&#xff0c;可以很容易解决树上最短路等问题。 为了方便&#xff0c;我们记…

星光不负赶路人|2022年终总结

时间真快&#xff0c;转眼又是年末。整理一篇文章来给自己好好做一次年终盘点&#xff0c;本着陈述事实&#xff0c;提炼精华&#xff0c;总结不足的思路&#xff0c;给自己这一年的工作、生活、成长画个句号。 工作 &#x1f3e2; 从经海路到中关村 去年换了工作&#xff0c…

Java设计模式中的创建者模式/单例模式是啥?单例模式其中的饿汉式与懒汉式又是啥?又可以用在哪些地方

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 4. 创建者模式 4.1 特点 使用者不需要知道对象的创建细节 4.2 单例模式 4.2.1使用场景 单例类&#xff1a;且仅能创建一个实例类访问类&#xff1a;使用单例类…

七、Gtk4-Defining a final class

1 定义一个最终类 1.1 一个非常简单的编辑器 在上一节中&#xff0c;我们创建了一个非常简单的文件查看器。现在我们继续重写它&#xff0c;并将其转换为非常简单的编辑器。它的源文件是tfe目录下的tfe1.c(文本文件编辑器1)。 GtkTextView是一个多行编辑器。因此&#xff0c…

java学习day71(乐友商城)购物车实现

今日目标&#xff1a; 1.实现未登录状态的购物车 2.实现登陆状态下的购物车 1.搭建购物车服务 1.1.创建module 1.2.pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&…

软件测试~测试分类

目录 1.按照是否查看代码划分 ① 黑盒测试(Black-box Testing) ② 白盒测试(White-box Testing) ③ 灰盒测试(Gray-Box Testing) 2.按照开发阶段划分 ① 单元测试(Unit Testing) ② 集成测试(Integration Testing) ③ 系统测试(System Testing) ④ 验收测试(Acceptance…

kNN分类

一、 概述 kNN(k nearest neighbor,k近邻)是一种基础分类算法&#xff0c;基于“物以类聚”的思想&#xff0c;将一个样本的类别归于它的邻近样本。 ![在这里插入图片描述] 二、算法描述 1.基本原理 给定训练数据集 T{(x1,y1),(x2,y2),...,(xN,yN)}T\left\{ \left( x_1,y_1 …

17. XML

文章目录一、XML概念二、XML语法1、基础语法2、快速入门3、组成部分4、约束1. 约束概述2. 分类3. DTD4. Schema三、XML解析1、操作xml文档2、 解析xml的方式1. DOM2. SAX3. xml常见的解析器&#xff08;工具包&#xff09;4. Jsoup&#xff08;1&#xff09;快速入门&#xff0…

VUE3 学习笔记(一):环境配置、项目创建

一、首先需要安装node.jsnodejs官网&#xff1a;Node.js (nodejs.org)下载安装包&#xff1a;下载稳定版本即可&#xff0c;目前&#xff08;2023-01-07&#xff09;是18.13.0版本c. 检查当前版本&#xff08;CMD&#xff09;&#xff1a;至此&#xff0c;nodejs已经安装成功&a…

电力系统机组组合(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

EM算法学习总结

序 这个和我的硕士毕业论文的题目就有一定关系&#xff0c;我的导师让我按时向她汇报学习进度。然而我还在进行实习&#xff0c;还要准备自己明年的秋招&#xff0c;只能想办法游走于三者之间。 EM算法是一个常用的数据挖掘算法&#xff0c;想必从事数据挖掘的相关工作的同学…

机器人操作系统ROS/ROS2(1)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、ROS和ROS2是什么&#xff1f;二、ROS2安装步骤1.Ubuntu虚拟机安装2.ROS2系统安装3.验证ROS2安装成功4.小海龟仿真示例总结前言 提示&#xff1a;这里可以添…

LeetCode刷题模版:21 - 30

目录 简介21. 合并两个有序链表22. 括号生成23. 合并K个升序链表24. 两两交换链表中的节点25. K 个一组翻转链表26. 删除有序数组中的重复项27. 移除元素28. 找出字符串中第一个匹配项的下标29. 两数相除【未理解】30. 串联所有单词的子串【未理解】结语简介 Hello! 非常感谢您…

devops 是什么东东了

DevOps&#xff0c;字面意思是Development &Operations的缩写。 DevOps是从实践中逐步总结提炼出的方法论理念。近而创造了DevOps这个词。 DevOps概念的萌芽阶段&#xff1a; 2008年敏捷大会上&#xff0c;来自Patrick Debois发表了题为 《Agile Infrastructure & Op…

基于.NET技术的动漫管理系统,给各位二次元老司机提供的动漫管理平台,基于.NET的前后端框架Blazor,含安装教程及使用说明

介绍 老司机驾驶舱——给各位二次元老司机提供的动漫管理平台。 下载地址&#xff1a;基于.NET技术的动漫管理系统 编写本应用的目的主要是实践巨硬&#xff08;Microsoft&#xff09;的新一代前端框架Blazor与EntityFramework&#xff0c;本应用也给想要学习这套框架的童鞋提…

Ubuntu20.04 hyperledger fabric2.4基于Docker搭建blockchain-explorer

准备 启动fabric测试网络。   这里默认已经完成了Fabric测试网络搭建以及运行。   后续会出Fabric安装&#xff0c;现在不会的就先去看别的博客 配置 1.在test-network 文件夹下面建立explorer文件夹&#xff1a; mkdir explorer2. 配置文件 2.1下载配置文件 先进文件…

Isaac Sim 机器人仿真器介绍、安装与 Docker [1]

前言与参考 此文书写于&#xff1a; January 6, 2023&#xff0c; 更新于 January 6, 2023 &#xff1b;可能会随着时间的变化 此教程会有过时概念哦 Isaac Sim 相关参考链接&#xff1a; 官方文档地址官方docker image 镜像地址官方讨论 论坛链接&#xff0c;建议没啥事就可…

【JavaGuide面试总结】Java基础篇·中

【JavaGuide面试总结】Java基础篇中1.重载和重写有什么区别&#xff1f;2.什么是可变长参数&#xff1f;3.为什么浮点数运算的时候会有精度丢失的风险&#xff1f;4.如何解决浮点数运算的精度丢失问题&#xff1f;5.超过 long 整型的数据应该如何表示&#xff1f;6.基本类型和包…

JSP——标准标签库 (JSTL)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;JAVA开发者…

5G NR标准: 第19章 毫米波射频技术

第19章 毫米波射频技术 现有的 2G、3G 和 4G 移动通信 3GPP 规范适用于 6 GHz 以下的频率范围&#xff0c;相应的 RF 要求考虑了与 6 GHz 以下操作相关的技术方面。 NR 也在这些频率范围内运行&#xff08;标识为频率范围 1&#xff09;&#xff0c;但另外还将定义为在 24.25…