十大排序算法【1】---冒泡排序、快速排序、选择排序、插入排序、希尔排序

news2024/10/7 12:01:58

动画演示

各种算法:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
6种常见排序算法:https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

1、冒泡排序

//1、冒泡排序Bubble Sort: 比较前后相邻的数据,按照升序或者降序规则调整
// 由于每次调整没有开辟新的内存空间,一直都是使用一个新内存空间,所以空间复杂度为O(1)
// 由于需要n轮调整,每轮调整 n-- 个数据,时间复杂度为O(n^2)
// data[]是int*指针,数组名,size 是数组的长度,有效数据个数
int* BubbleSort(int data[], size_t size)
{
	int max;//临时存储最大值
	//共循环n = size轮
	for (int i = 0; i < size; i++)
	{
		//每一轮操作的数据为n = size-i,循环完一轮就排好了一个数,那么需要操作的数就每次-1
		for (int j = 1; j < size - i; j++)
		{
			//如果前面的数大于后面的数,就交换,每一轮找到最大的数,并放到最后
			if (data[j-1] > data[j])
			{
				max = data[j-1];
				data[j-1] = data[j];
				data[j] = max;
			}
		}
	}
	return data;
}

2、快速排序

//快速排序QuickSort,对冒泡排序的优化
//分而自治的思想,找一个参考值,左边小于参考值,右边大于参考值,再更换参考值继续
//时间和空间复杂度为O(nlog_2 n)
int* QuickSort(int data[], int left , int right)
{
	if (left >= right)
		return data;
	int i = left;
	int j = right;
	int base = data[left];
	while ( i < j )
	{
		//此方法必须先从后面找小的,先从前面会出错
		while (data[j] >= base && (i < j))//右边边是大的就继续找到小的
			j--;
		while (data[i] <= base && (i < j))//左边是小的就继续找到大的
			i++;
		if (i < j)
		{
			int temp = data[i];
			data[i] = data[j];
			data[j] = temp;
		}
	}
	data[left] = data[i];
	data[i] = base;//将base放在中间,左边都是小的,右边是大的
	QuickSort(data, left, i-1);//先递归左边区域
	QuickSort(data, i+1, right);
	return data;
}

3、选择排序

//2、选择排序SelectSort:每一次在所有数据中找出最小值或者最大值,然后在最开始或最末尾进行交换
//需要找n = size次数据,每次找n-i个数据,时间复杂度为O(n^2),空间复杂度为O(1)
int* SelectSort(int data[], size_t size)
{
	int min, temp;//临时存储最小值和最小值所在的下标
	for (int i = 0; i < size; i++)
	{
		min = data[i];//把需要交换的位置做好标记
		temp = i;
		for (int j = i + 1; j < size; j++)
		{
			if (data[j] < min)
			{
				min = data[j];//如果找到新的最小值,做好标记
				temp = j;
			}
		}
		data[temp] = data[i];//进行位置的交换,如果当前就是最小值,返回自己
		data[i] = min;
	}
	return data;
}

4、插入排序

//3、直接插入排序InsertSort:每次从后面新增一个数据,然后排好序再新增数据
//新增n = size-1个数据,新增了之后重排i+1个数据,时间复杂度O(n^2),空间复杂度O(1)
int* InsertSort(int data[], size_t size)
{
	int temp;
	for (int i = 0; i < size - 1; i++)
	{
		for (int j = i + 1; j > 0; j--)//每次从后面新增一个数据,并判断大小
		{
			if (data[j] < data[j - 1])//如果后面的值大于前面的就交换
			{
				temp = data[j-1];
				data[j - 1] = data[j];
				data[j] = temp;
			}
		}
	}
	return data;
}

5、希尔排序

//4、希尔排序SheelSort,对插入排序的优化
//时间复杂度O(n^1.3),空间复杂度O(1)
int* SheelSort(int data[], size_t size)
{
	int temp;
	size_t gap = size / 2;
	while (gap > 0)//最小间隔为1
	{
		for (size_t i = gap; i < size; i++)//从第一个间隔位置开始
		{
			size_t j = i;
			while ((j>=gap)&&(data[j]<data[j-gap]))//插入排序
			{
				temp = data[j - gap];
				data[j - gap] = data[j];
				data[j] = temp;
				j -= gap;//如果当前位置超过了2倍gap,还需要继续判断,相当于插入排序
			}
		}
		gap /= 2;//每次将gap减半
	}
	return data;
}

在这里插入图片描述

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

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

相关文章

SQL刷题笔记day6——转战LeetCode

1 第二高的薪水 ​ 我的代码&#xff1a; SELECT Salary SecondHighestSalary FROM Employee ORDER BY Salary DESC LIMIT 1, 1 我的代码不满足示例2的情况&#xff1a;如果没有第 2 高的薪资&#xff0c;即表里可能只有一条记录&#xff0c;这个解答会被评测为 Wrong Answ…

K8s集群之 存储卷 PV PVC

默写 1 如何将pod创建在指定的Node节点上 node亲和、pod亲和、pod反亲和: 调度策略 匹配标签 操作符 nodeAffinity 主机 In,NotIn,Exists,DoesNotExist&#xff0c;Gt&#xff0c;Lt podAffinity …

从零开始学Vue3--根据目录结构自动生成路由

我们在测试或者小项目中经常遇到一个问题&#xff0c;就是加一个页面&#xff0c;就要在router.js中加一个路由&#xff0c;相当的麻烦&#xff0c;有没有办法可以根据目录结构自动生成路由呢&#xff1f; 想要自动生成路由&#xff0c;最重要的是能够获取指定目录下vue的路径…

调试记录-U盘枚举失败之LPM影响

现象 板子接部分U盘出现枚举失败&#xff0c;看log像是硬件信号问题&#xff0c;如&#xff1a; [ 29.186464] usb usb3-port1: Cannot enable. Maybe the USB cable is bad? [ 30.079624] usb usb3-port1: Cannot enable. Maybe the USB cable is bad? [ 30.080200]…

网络故障与排除(一)

一、Router-ID冲突导致OSPF路由环路 路由器收到相同Router-ID的两台设备发送的LSA&#xff0c;所以查看路由表看到的OSPF缺省路由信息就会不断变动。而当C1的缺省路由从C2中学到&#xff0c;C2的缺省路由又从C1中学到时&#xff0c;就形成了路由环路&#xff0c;因此出现路由不…

spring分析工具_springboot startup analyze的部署和使用

工具是开源工具 ,可以放心使用 我是从开源中国OCSChina看到的顺便安利一下 部署 教程 https://github.com/linyimin0812/spring-startup-analyzer 直接下载地址 https://github.com/linyimin0812/spring-startup-analyzer/releases/download/v3.0.0/spring-startup-analyzer.…

基于心电疾病分类的深度学习模型部署应用于OrangePi Kunpeng Pro开发板

一、开发板资源介绍 该板具有4核心64位的处理器和8TOPS的AI算力&#xff0c;让我们验证一下&#xff0c;在该板上跑深度学习模型的效果如何&#xff1f; 二、配网及远程SSH登录访问系统 在通过microusb连接串口进入开发板调试&#xff0c;在命令行终端执行以下命令 1&#…

三. Stream API

1. 过滤 record Fruit(String cname, String name, String category, String color) { }Stream.of(new Fruit("草莓", "Strawberry", "浆果", "红色"),new Fruit("桑葚", "Mulberry", "浆果", "紫…

【Qt秘籍】[005]-Qt的首次邂逅-创建

一、如何创建文件&#xff1f; 当我们打开Qt Creator&#xff0c;你会发现整个界面类目繁多。现在&#xff0c;让我们直接开始新建一个项目。 1.点击左上角的“文件”>点击“新建文件或项目” 2.如图&#xff0c;选择“Application”>“Qt Wifgets application”> “…

发现没:随便搞个B端页面,就想在客户那里过关,难啦。

客户对B端界面要求越来越高的原因可以有以下几点&#xff1a; 用户体验要求提升&#xff1a;随着用户对移动应用和网页的使用经验增加&#xff0c;他们对于界面的交互、流畅性和易用性要求也越来越高。他们希望能够在使用B端应用时&#xff0c;能够快速、方便地完成任务&#…

Android下HWC以及drm_hwcomposer普法(上)

Android下HWC以及drm_hwcomposer普法(上) 引言 按摩得全套&#xff0c;错了&#xff0c;做事情得全套&#xff0c;普法分析也是如此。drm_hwcomposer如果对Android图形栈有一定研究的童鞋们应该知道它是Android提供的一个的图形后端合成处理HAL模块的实现。但是在分析这个之前…

教程来咯!如何在Windows10中设置代理IP?

很多用户在使用win10系统的时候&#xff0c;网络设置都是默认的&#xff0c;一般情况下代理服务器都是关闭的状态&#xff0c;而在一些特殊情况下&#xff0c;需要设置代理地址启动功能使用&#xff0c;有不少的用户不知道应该怎么进行设置添加&#xff0c;接下来就和各位用户们…

Docker容器技术----什么是容器?

目录 什么是容器&#xff1f; 容器与虚拟机的区别 为什么要使用容器&#xff1f; 为什么这几年来容器技术一下子流行了起来&#xff1f; 什么是容器&#xff1f; 先看看我们生活中的容器。生活中见到的瓶瓶罐罐&#xff0c;就是容器&#xff0c;用来成放东西&#xff0c;并…

Honor of Kings 2024.03.29 Ban for 3 day

我又被举报消极然后禁赛 都说了别选蔡文姬&#xff0c;对面三个肉&#xff0c;非要选个软辅助 吐槽下这游戏策划&#xff1a;游戏体验感越来越差&#xff0c;公正也很差 对说了对面4个法师&#xff0c;就是不出魔抗&#xff0c;把把都是0-N开局&#xff0c;到底谁消极啊&#x…

NI PXIe-7857R与PXIe-8842的区别

一、NI PXIe-7857R 类型&#xff1a; FPGA模块&#xff1a;基于FPGA的可编程I/O模块。 主要功能&#xff1a; FPGA处理&#xff1a;包含Xilinx Kintex-7 FPGA&#xff0c;支持自定义逻辑和处理。 I/O接口&#xff1a;提供丰富的模拟和数字I/O通道。 高速数据处理&#xff1a…

IO系列(十) -TCP 滑动窗口原理解析

一、摘要 之前在知乎上分享网络编程知识文章的时候&#xff0c;有个网友私信给我留言了一条“能不能写一篇关于 TCP 滑动窗口原理的文章”。 当时没有立即回复&#xff0c;经过查询多方资料&#xff0c;发现这个 TCP 真的非常非常的复杂&#xff0c;就像一个清澈的小沟&#…

【Linux 网络编程】协议的分层知识!

文章目录 1. 计算机网络背景2. 认识 "协议"3. 协议分层 1. 计算机网络背景 网络互联: 多台计算机连接在一起, 完成数据共享; &#x1f34e;局域网&#xff08;LAN----Local Area Network&#xff09;: 计算机数量更多了, 通过交换机和路由器连接。 &#x1f34e; 广…

重学java 51.Collections集合工具类、泛型

"我已不在地坛&#xff0c;地坛在我" —— 《想念地坛》 24.5.28 一、Collections集合工具类 1.概述:集合工具类 2.特点: a.构造私有 b.方法都是静态的 3.使用:类名直接调用 4.方法: static <T> boolean addAll(collection<? super T>c,T... el…

【Node】nodejs版本管理切换工具

1、nvm介绍 Node Version Manager&#xff08;NVM&#xff09; 是一种用于管理多个主动节点.js版本的工具。 Node.js平台&#xff0c;Node.js工具社区和Node.js库是快速移动的目标 - 在一个Node.js版本下可能有效的方法不能保证适用于另一个版本的Node.js。因此&#xff0c;用户…

人工智能的数学基础(高数)

&#x1f31e;欢迎来到人工智能的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年5月29日&…