排序算法之你不得不知道的(1)

news2024/12/26 10:44:40

一、排序运用场景

(1)排序概念:将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。

(2)运用场景:

(1)淘宝、支付宝、京东等购物平台的价格排序、质量排序、商家服务态度排序等…

(2)全国高校排名排序、院校专业排序…

二、常见排序算法

(1)排序算法分类

在这里插入图片描述

注:以下是排序算法的细节讲解!!!

【1】气泡的舞蹈

对于冒泡排序,相信大家都对其并不陌生。虽然其时间复杂度不好,一般不作为工程上的排序使用,但是其也有着排序初步认识的地位!

①冒泡排序(Bubble Sort):一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

根据冒泡排序的特性,我们就可以使用代码来将其过程模拟出来!

void Swap(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}


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



//排序->升序
void Bubble_Sort(int* arr, int size)
{
	//假设初始状态的数组为有序
	int flag = 1;

	for (int i = 0; i < size; i++)
	{
		for (int j = 0; j < size-i-1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				Swap(arr[j], arr[j + 1]);
				flag = 0;
			}
		}
		if (flag == 1)
		{
			break;
		}
	}
}

这是实现的效果图:

在这里插入图片描述

代码解释:

1、对于初始化flag=1的解释:在这里插入图片描述

2、对于在一次遍历过程中,进入if判断条件之后的对于flag=0的解释:在这里插入图片描述

3、对于结束遍历条件的解释:在这里插入图片描述

下面放一个冒泡排序的动图!

在这里插入图片描述

【2】希尔的节奏

注:在学习希尔之前,我们需要了解一些希尔排序的历史!

其实,希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。所以,我们在接触希尔排序之前,需要了解并熟悉应用直接插入排序的算法思路和代码实现!

(1)前奏:直接插入排序

以下是直接插入排序的动图!在这里插入图片描述

从中我们可以看到:直接插入排序可以说成是将一条记录插入到已排好的有序表中,从而得到一个新的有序表。

以下是代码实现!

void Insert_Sort(int* arr, int size)
{
	for (int i = 0; i < size-1; i++)
	{
		//定义已排序的最后一个数据下标为end
		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;
	}
}

以下是终端结果:

在这里插入图片描述

代码的解释:

在这里插入图片描述

从直接插入排序算法我们可以很容易的得到其时间复杂度为O(N^2),其代码运行的效率并不好,有什么解决方法吗???

(2)高潮:希尔排序

①希尔排序定义:插入排序的一种,又称“缩小增量排序”。

②基本思想:相对于直接插入排序的对整个数组进行‘1’分组,希尔排序通常将数组先分成几个大数组,在这几个大数组中先进行直接插入排序,在对每个大数组进行排序,从而减少插入排序的时间复杂度!

③直接插入排序其实就是希尔排序增量为‘1’的特殊情况!

下面是其代码的实现:

void Shell_Sort(int* arr, int size)
{
	//提供一个分组变量
	int gap = size;
	while (gap>1)
	{
		gap = gap / 3 + 1;
		for (int i = 0; i < size - gap; i++)
		{
			//定义已排序的最后一个数据下标为end
			int end = i;
			int tmp = arr[end + gap];
			while (end >= 0)
			{
				if (tmp < arr[end])
				{
					arr[end + gap] = arr[end];
					end-=gap;
				}
				else
				{
					break;
				}
			}
			arr[end + gap] = tmp;
		}
	}
}

以下是代码解释:

gap = gap / 3 + 1;

这串代码是将数组进行分组,将数组分成gap组,先将每组内部的数据排成有序的,最后当 gap=1 时即进行一次直接插入排序,即完成数组的排序!

这是终端结果:

在这里插入图片描述

因为希尔排序又被称作“减少增量排序”,所以其减少增量的方法也是各不相同的!下面是Sedgewick的增量序列:

在这里插入图片描述

④希尔排序的时间复杂度大概为:O(N^1.3).

【3】选择的艺术

①选择排序也因为其时间复杂度过高的原因,一般在实践中不作为使用,但在学习和深入了解排序算法仍然有其作用!

②算法思想:每一次从待排序的数组元素中选出最小的/最大的,存放在序列的起始位置/终止位置,直到所有数据排完为止!

③直接选择排序的动图:
在这里插入图片描述

代码实现:

void Select_Sort(int* arr, int size)
{
	int begin = 0, end = size - 1;
	while (begin<end)
	{
		//这里的maxi和mini都是指数组中数字的下标
		int maxi = end, mini = begin;
		for (int i = begin; i <= end; i++)
		{
			if (arr[i] < arr[mini]) {
				mini = i;
			}
			if (arr[i] > arr[maxi])
			{
				maxi = i;
			}
		}
		//防止当max和begin值相等时,出现多次错误交换!
		if (maxi == begin)
		{
			maxi = mini;
		}
		Swap(arr[begin], arr[mini]);
		Swap(arr[end], arr[maxi]);
		begin++;
		end--;
	}
}

以下是终端结果:

在这里插入图片描述

本期结束!我们下期再见!!!

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

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

相关文章

vue的h函数和template语法如何混用?

前言&#xff1a; h函数定义&#xff1a; 我们编写的代码转化为真正的dom时&#xff0c;首先会先转换为VNode,然后多个Vnode进行结合起来转化为VDOM&#xff0c;最后VDOM才渲染成真实的DOM。在 Vue.js 中&#xff0c;h 函数是 createElement 的别名&#xff0c;它是 Vue 用来创…

如何使用ssm实现基于vue的学生宿舍设备报修管理系统的设计与实现+vue

TOC ssm804基于vue的学生宿舍设备报修管理系统的设计与实现vue 绪论 1.1 选题背景 当人们发现随着生产规模的不断扩大&#xff0c;人为计算方面才是一个巨大的短板&#xff0c;所以发明了各种计算设备&#xff0c;从结绳记事&#xff0c;到算筹&#xff0c;以及算盘&#x…

基于java SpringBoot和Vue校园求职招聘系统设计

摘要 随着信息技术的迅猛发展&#xff0c;基于Java Spring Boot和Vue的校园求职招聘系统设计成为了解决高校就业难问题的重要手段。本文旨在探讨如何利用Java Spring Boot框架构建后端服务&#xff0c;以及使用Vue.js进行前端开发&#xff0c;从而创建一个高效、易用且功能全面…

【JavaScript】JS核心语法及函数

文章目录 一、初识 JS二、JS 核心语法2-1 变量2-2 数据类型typeofString 对象 2-3 数组创建数组常用属性方法 2-4 运算符号加号运算符 减号运算符 -比较运算符逻辑运算符 2-5 控制语句for-inbreakcontinue 三、函数3-1 常用系统函数3-2 自定义函数函数声明函数调用 3-3 创建对象…

RISC-V知识点目录

分支预测 分支预测概述https://blog.csdn.net/zhangshangjie1/article/details/136947089?sharetypeblogdetail&sharerId136947089&sharereferPC&sharesourcezhangshangjie1&spm1011.2480.3001.8118分支指令的方向预测https://blog.csdn.net/zhangshangjie1/a…

高效微调理解(prompt-tuning,p-tuning v1,p-tuning v2,lora)

高效微调&#xff08;prompt-tuning&#xff0c;p-tuning v1&#xff0c;p-tuning v2&#xff0c;lora&#xff09; 1.prompt-tuning&#xff1a; 例子理解&#xff1b;保持原本模型参数不变&#xff0c;通过训练提示词的参数调整prompt&#xff0c;使其与下游任务匹配。 例子…

HCIP-HarmonyOS Application Developer 习题(八)

&#xff08;填空&#xff09;1、声明式开发范式中使用装饰器( )装饰的结构体具有组件化能力&#xff0c;能够成为一个自定义组件。 答案&#xff1a;component 分析&#xff1a;component 装饰的struct表示该结构体具有组件化能力&#xff0c;能够成为一个独立的组件&#xff…

IT行业哪些证书可以应对就业难?

作为IT运维专业人士&#xff0c;持续增强自身的专业技能和知识是提升职场竞争力、实现升职加薪的关键途径。 下面为大家搜罗了5本适合IT运维人员考取的证书。 一、ITSS认证 ITSS&#xff0c;即信息技术服务标准&#xff0c;是一套涵盖了IT服务领域的标准库和方法论。 这是我…

企业升级首选:Windows 11 24H2 LTSC 纯净企业版!

今日&#xff0c;系统之家小编给大家带来最新的Windows11 24H2 LTSC 2024 纯净企业版下载&#xff0c;该版本系统是离线制作而成&#xff0c;各种各样的捆绑软件也都删除了&#xff0c;确保系统是安全无毒&#xff0c;还具备出色的稳定性与安全性&#xff0c;非常适合企业用户办…

自动猫砂盆真的有必要入手吗?自用不踩雷的选购干货分享!

平时出门在外忙碌&#xff0c;要如何保持猫咪的猫砂盆卫生就成了一个很重要的问题&#xff0c;要知道猫咪拉屎需求特别频繁&#xff0c;如果猫砂盆里的猫屎堆积过量&#xff0c;猫咪就很有可能嫌弃&#xff0c;然后寻找其他地方排泄&#xff0c;这就导致了家里大大小小都充斥着…

Python精选200Tips:186-190

针对序列&#xff08;时间、文本&#xff09;数据的网络结构 续 P186-- 双向LSTM(Bidirectional Long Short-Term Memory 2005)&#xff08;1&#xff09;模型结构说明&#xff08;2&#xff09;创新性说明&#xff08;3&#xff09;示例代码&#xff1a;IMDB电影评论情感分析 …

python爬虫 - 进阶requests模块

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、SSL证书问题 &#xff08;一&#xff09;跳过 SSL 证书验证 &#xff0…

【C++打怪之路Lv7】-- 模板初阶

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…

基于SpringBoot的设备管理系统源码带本地搭建教程

技术框架&#xff1a;SpringBoot mybatis thymeleaf Mysql5.7 Fastjson Druid Shiro 运行环境&#xff1a;jdk8 IntelliJ IDEA maven 宝塔面板 系统功能&#xff1a;登陆&#xff0c;注册&#xff0c;系统用户管理&#xff0c;角色&#xff0c;部门管理&#xff0c;…

如何在电脑上创建虚拟网卡

1.右键点击此电脑&#xff0c;选择——管理 2.选择设备管理器——网络适配器&#xff0c;在点击操作选择 添加过时硬件 3.点击 下一页 4.在这里选择网络适配器&#xff0c;点击下一页 5.选择微软的环回适配器 6.打开控制面板 7.点击网络和Internet 8.点击网络和共享中心 9…

多表数据实时同步和批量实时同步怎么高效实现?

对于企业来说&#xff0c;准确、及时的数据是进行数据分析和决策支持的基础。如果各个系统中的数据不能及时同步&#xff0c;就会影响数据分析的结果和决策的准确性。通过数据同步&#xff0c;可以将企业内部各个系统中的数据整合到一个数据仓库或数据分析平台中&#xff0c;为…

Jenkins打包,发布,部署

一、概念 Jenkins是一个开源的持续集成工具&#xff0c;主要用于自动构建和测试软件项目&#xff0c;以及监控外部任务的运行。与版本管理工具&#xff08;如SVN&#xff0c;GIT&#xff09;和构建工具&#xff08;如Maven&#xff0c;Ant&#xff0c;Gradle&#xff09;结合使…

【LeetCode刷题】:双指针篇(移动零、复写零)

文章目录 一、移动零1. 题目解析2. 算法原理3. 代码编写 二、复写零1. 题目解析2. 算法原理3. 代码编写 一、移动零 1. 题目解析 题目&#xff1a;移动零【点击跳转题目】 大致题意就是将数组中所有为0的元素往后移&#xff0c;移到数组的末尾&#xff0c;但是所有的非零元素…

shell脚本写代码

用简单的test语句来判断是否闰年 #! /bin/bash read -p "sd " yearif [ $((year%4)) -eq 0 -a $((year%100)) -ne 0 -o $((year%400)) -eq 0 ]thenecho "是润年"elseecho "不是闰年" fi判断一个数是否为偶数 #! /bin/bash read -p "…

PDF怎么转换成TXT文本?这4个方法简单还免费,pdf转txt就靠它!

PDF怎么转换成TXT文本&#xff1f;PDF文件虽然广泛支持&#xff0c;但在某些设备或软件上可能无法完全正确显示&#xff0c;尤其是当文件包含特殊字体或复杂布局时。此外&#xff0c;PDF文件的阅读体验也可能受到格式干扰&#xff0c;如复杂的背景颜色或字体样式。将PDF转换为T…