【数据结构】排序算法篇一

news2024/11/16 8:18:37

【数据结构】排序算法篇一

  • 1. 插入排序
    • (1)基本思想:
    • (2)动态图解:
    • (3)具体步骤:
    • (4)代码实现:
    • (5)特性总结:
  • 2. 希尔排序( 缩小增量排序 )
    • (1)基本思想:
    • (2)静态图解:
    • (3)具体步骤:
    • (4)代码实现:
    • (5)特性总结:
  • 3. 堆排序
    • (1)基本思想:
    • (2)具体步骤:
    • (3)代码实现:
    • (4)特性总结:
  • 4. 选择排序
    • (1)基本思想:
    • (2)动态图解:
    • (3)具体步骤:
    • (4)代码实现:
    • (5)特性总结:

1. 插入排序

(1)基本思想:

由下图可以得出:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

(2)动态图解:

在这里插入图片描述

(3)具体步骤:

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

(4)代码实现:

void InsertSort(int *a,int aSize)
{
	for (int i = 1; i < aSize; i++)
	{
		int end = i - 1;
		int tmp = a[i];//tmp需要保存的是数组i处的值(a[i]),如果存下标,会被a[end + 1] = a[end];该句代码覆盖
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
			a[end + 1] = tmp;
		}
	}
}

(5)特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的排序算法
  4. 稳定性:稳定

2. 希尔排序( 缩小增量排序 )

(1)基本思想:

先选定一个整数(gap),把待排序文件中所有记录分成个若干组,所有距离为gap的记录分在同一组内,并对每一组内的记录进行排序。然后gap缩小,重复上述分组和排序的工作。当gap到达=1时,所有记录在统一组内排好序。

(2)静态图解:

在这里插入图片描述

(3)具体步骤:

该排序部分类似于插入排序

(4)代码实现:

void ShellSort(int* a, int aSize)
{
	int gap = aSize;
	while (gap > 1)
	{
		//gap > 1 预排序//gap = 1 插入排序
		gap /= 2;//或gab/=3+1;保证gab最后可等于1,此时即为最后一遍插入排序
		for (int i = 0; i < aSize - 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;
			}
		}

	}
}

(5)特性总结:

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快,可以达到优化的效果。
  3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,因此希尔排序的时间复杂度未固定

在这里插入图片描述

3. 堆排序

(1)基本思想:

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是
通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆

(2)具体步骤:

先实现一个向下调整建大堆函数,利用其将欲排序数组建为大堆,然后按照下面思想实现升序
在这里插入图片描述

(3)代码实现:

void Swap(int* p, int* q)
{
	int tmp = *p;
	*p = *q;
	*q = tmp;
}
void AdjustDown(int* a, int aSize, int parent)//向下调整建大堆
{
	int child = 2 * parent + 1;
	while (child < aSize)
	{
		//不要漏掉条件child + 1 < aSize
		if (child + 1 < aSize && a[child] < a[child + 1])
		{
			child++;
		}
		//此时a[child]为大孩子
		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = 2 * parent + 1;
		}
		else
		{
			break;
		}
	}
}
void HeapSort(int* a, int aSize)
{
	for (int i = (aSize - 1 - 1) / 2; i >= 0; i--)//将数组a建为大堆
	{
		AdjustDown(a, aSize, i);
	}
	//实现升序
	int end = aSize - 1;
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		end--;
	}
}

(4)特性总结:

  1. 堆排序使用堆来选数,效率就高了很多。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

4. 选择排序

(1)基本思想:

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

(2)动态图解:

在这里插入图片描述

(3)具体步骤:

在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素,若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换,在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余1个元素

(4)代码实现:

void Swap(int* p, int* q)
{
	int tmp = *p;
	*p = *q;
	*q = tmp;
}
void SelectSort(int* a, int aSize)
{
	for (int j = 0; j < aSize; j++)
	{
		int min = j;
		for (int i = j; i < aSize; i++)
		{
			if (a[i] < a[min])
			{
				min = i;
			}
		}
		Swap(&a[min], &a[j]);
	}
}

(5)特性总结:

  1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

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

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

相关文章

数据治理下的主数据管理与KPaaS的应用

在2024中国国际大数据产业博览会&#xff08;简称“数博会”&#xff09;上&#xff0c;数据治理作为大数据领域的热点主题之一&#xff0c;引起了广泛关注。这一议题之所以成为焦点&#xff0c;是因为在数字化时代&#xff0c;数据已经上升为企业最具价值的战略资源之一。随着…

【区块链 + 智慧文旅】城商行旅游金融联盟:旅游金融联盟平台 | FISCO BCOS应用案例

深圳优讯基于FISCO BCOS搭建面向联盟成员间使用的开 放式客户服务平台&#xff0c;平台于2018年6月底上线。 成员机构之间共享产品、流量、征信和金融资源&#xff0c;整合旅游产业链资源&#xff0c;实现跨地域的旅游金融协作。

【STM32单片机_(HAL库)】3-3【中断EXTI】使用SysTick模拟多线程

1.硬件 STM32单片机最小系统 LED灯模块 硬件接线 STM32LED1LED2PB8负极PB9负极5V5V5V 2.软件 led、tasks驱动文件添加GPIO常用函数main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "tasks.h"int mai…

.NET HandyControl 深度解析:一个现代化的UI控件库

文章目录 前言一、选择HandyControl的原因二、如何使用HandyControl1.安装HandyControl2.使用代码例子 总结 前言 在.NET开发领域&#xff0c;UI&#xff08;用户界面&#xff09;设计的美观性和易用性对于应用程序的成功至关重要。为了帮助开发者快速构建现代化、美观且用户友…

日常避坑指南:重试装饰器的正确使用方式

在日常开发中,重试机制是提高代码健壮性的重要手段之一,尤其是在处理网络请求时,遇到超时或临时性错误的情况并不少见。通过重试,我们可以在一定程度上降低这些临时问题带来的影响。然而,如果使用不当,重试机制本身也可能引发新的问题,甚至让问题更加难以排查。 问题背…

Framework | Android语音识别框架与语音交互概览

Framework | Android语音识别框架与语音交互概览 随着智能设备的普及,语音识别与语音交互技术在现代生活中扮演着越来越重要的角色。无论是在驾驶场景中解放用户的双手,还是在智能家居中通过语音控制设备,语音技术的应用场景已经深入到各个领域。本文将深入探讨Android平台…

Live800:数字化转型下的客户服务新生态

在数字化转型的浪潮中&#xff0c;企业客户服务领域正经历着前所未有的变革。数字技术如大数据、云计算、人工智能和物联网等&#xff0c;不仅重塑了企业的运营模式&#xff0c;更深刻地改变了客户服务的面貌&#xff0c;构建了一个全新的客户服务生态。 一、数字化转型的驱动力…

在docker中安装skywalking + es

ES的版本和官网 es版本&#xff1a; Past Releases of Elastic Stack Software | Elastic es版本logstash版本JDK版本对应关系 支持一览表 | Elastic skywalking的版本说明和官网 Advanced deployment | Apache SkyWalking skywalking和es的对应关系&#xff0c;在网页的…

实训第三十二天(学习playbook-roles,脚本创建数据库和表,mycat读写分离)

1、roles&#xff08;角色&#xff09;介绍 roles(⻆⾊): 就是通过分别将variables, tasks及handlers等放置于单独 的⽬录中,并可以便捷地调⽤它们的⼀种机制。 假设我们要写⼀个playbook来安装管理lamp环境&#xff0c;那么这个 playbook就会写很⻓。所以我们希望把这个很⼤的…

Native开发与逆向第二篇 - 动态注册函数逆向

ida静态分析 示例app是网上找的一个杀毒软件&#xff0c;做安全的app防护应该是OK的。 直接找到JNI_OnLoad 类名没处理&#xff0c;直接是明文。 jint JNI_OnLoad(JavaVM *vm, void *reserved) {jint v2; // w19__int64 v4; // [xsp0h] [xbp-30h] BYREFqword_25148 vm;if ( …

全免费的数据恢复工具推荐!这几个不容错过!

不小心的数据丢失总会带来许多困扰&#xff0c;不过这些困扰也能通过一些全免费的数据恢复工具解决。接下来&#xff0c;就来给大家介绍几款好用的数据恢复工具&#xff01; 第一款&#xff1a;福昕数据恢复 直达链接&#xff1a;www.pdf365.cn/foxit-restore/ 福昕数据恢复…

6.2K star!推荐一款开源混沌工程测试平台:Chaos Mesh

1、Chaos Mesh 介绍 Chaos Mesh是一个开源的混沌工程平台&#xff0c;旨在帮助用户在生产环境中测试、验证和优化其应用程序的可靠性和稳定性。通过引入故障注入和混沌工程原则&#xff0c;Chaos Mesh可以模拟各种故障场景&#xff0c;如网络延迟、节点故障、磁盘故障等&#…

【spring】学习笔记1:starter和application

https://spring.io/toolsSpring Boot Extension Pack vs版本 使用Spring Tool Suite初始化Spring项目

如何将本地的hexo博客部署到云服务器

云服务器系统&#xff1a;centos 7 本地电脑 mac 第一步&#xff1a; 初始化Hexo博客 npm install hexo-cli -g hexo init HexoBlog 注意node版本需要16以上 cd HexoBlog hexo server访问地址localhost:4000 云服务器执行以下操作 配置的ssh访问用户 useradd git passw…

知网硕士论文稿酬领取方式

目录 知网硕士论文稿酬领取方式: 建议:版税制付酬 版税 知网 学位年度2008年(含2008年)以后的稿酬标准 知网硕士论文稿酬领取方式: 建议:版税制付酬 你怎么能把自己看死了,以后有大用。 中国知网是由清华大学、清华同方发起,始建于1999年6月,是以实现全社会知识…

一文300字从0到1使用Postman轻松搞定文件上传测试!

postman经常用于接口测试&#xff0c;但是上传文件参数还是蛮复杂的&#xff0c;记录下过程 01、上传文件参数 1.选择请求方式 选择post请求方式&#xff0c;输入请求地址 2.填写Headers Key&#xff1a;Content-Type &#xff1b; Value&#xff1a;multipart/form-data …

【数学建模】层次分析法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。前言 – 人工智能教程 在数学建模问题求解中什么时候用到层次分析法 在数学建模问题求解中&#xff0c;层次分析法&#xff08;Analytic…

Python进阶04-网络编程

零、文章目录 Python进阶04-网络编程 1、计算机网络 网络相关知识请参考计算机网络详解 &#xff08;1&#xff09;IP地址的概念 IP 地址就是标识网络中设备的一个地址&#xff0c;好比现实生活中的家庭地址。 &#xff08;2&#xff09;IP地址的表现形式 IP 地址分为两类…

ArcGIS栅格裁剪与合并,制作等高线

1、下载高程数据&#xff08;DEM&#xff09; https://mp.weixin.qq.com/s/ewlUUVV0PwdcspPGtSdCog 项目区域对应的卫片&#xff0c;也可以在谷歌地图里看大致经纬度范围 2、项目区域 确定项目区域&#xff0c;例如某个县区范围 3、栅格裁剪与合并 将DEM多个栅格数据合并&#…

《黑神话:悟空》惊世背后,AI 究竟如何铸就数字人神话?

在游戏的广袤世界中&#xff0c;每一部新作的问世皆如一次扣人心弦的探险之旅。而《黑神话&#xff1a;悟空》的惊艳登场&#xff0c;无疑是一场震撼灵魂的奇幻冒险。它象征着中国游戏产业的一次石破天惊的飞跃&#xff0c;更是 AI 技术在游戏制作领域应用的杰出典范。 AI时代已…