数据结构-C语言-排序(2)

news2024/9/21 12:47:49

        代码位置:test-c-2024: 对C语言习题代码的练习 (gitee.com)

一、前言:

1.1-排序定义:

排序就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。(注:我们这里的排序采用的都为升序)

1.2-排序分类:

常见的排序算法:
  • 插入排序
    a. 直接插入排序
    b. 希尔排序

  • 选择排序
    a. 选择排序
    b. 堆排序
  • 交换排序
    a. 冒泡排序
    b. 快速排序
  • 归并排序
    a. 归并排序
  • 非比较排序
    a.计数排序
    b.基数排序

1.3-算法比较:

1.4-目的:

        今天,我们这里要实现的是选择排序、堆排序、冒泡排序

二、选择排序:

2.1-思路:

        1.找到数组中最小的元素,拎出来,将它和数组的第一个元素交换位置;

        2.找到数组中最大的元素,拎出来,将它和数组的最后一个元素交换位置;        

        3.在剩下的元素中继续寻找最小的元素,拎出来,和数组的第二个元素交换位置;

        4.在剩下的元素中继续寻找最大的元素,拎出来,和数组的倒数第二个元素交换位置;

        5.需要注意max若与left位置相同时需特殊处理,否则位置交换会出现问题;

        6.如此循环,直到整个数组排序完成;

        7.若是由大到小也是同样方法,只需要修改比较大小的符号;

2.2-过程图:

2.3-代码:


//升序
void SelectSort(int* a, int len)			//选择排序---时间复杂度(O(N^2))
{
	printf("原数组顺序:");
	for (int i = 0; i < len; i++)
	{
		printf("%d  ", a[i]);
	}
	printf("\n");
	int left = 0;
	int right = len - 1;

	int max = 0;
	int min = 0;
	while (left < right)
	{
		max = min = left;
		for (int i=left; i<=right; i++)
		{
			if (a[i] > a[max])
				max = i;
			if (a[i] < a[min])
				min = i;
		}
		Swap(&a[left], &a[min]);
		if (max == left)
		{
			max = min;
		}
		Swap(&a[right], &a[max]);
		++left;
		right--;
		printf("第%d时排序:",left);
		for (int i = 0; i < len; i++)
		{
			printf("%d  ", a[i]);
		}
		printf("\n");
	}
	
}

2.4-效果图:

2.5-性质:

由上述代码及图片见:

时间复杂度:

        简单选择排序是通过两层循环实现。 第一层循环:依次遍历序列当中的每一个元素 第二层循环:将遍历得到的当前元素依次与余下的元素进行比较,符合最小元素的条件,则交换。每次循环时间复杂度都为O(N)所以选择排序时间复杂度为O(N^2)

空间复杂度:

        因为没开辟空间,所以空间复杂度为O(1)。

稳定性:

        选择排序是一种不稳定的排序算法。 我们可以从上面的图片中看出,选择排序每次都要找剩余未排序元素中的最小值,并和前面的元素交换位置,这样破坏了稳定性。 比如说:5,8,5,2,9 这样一组数据,使用选择排序算法来排序的话,第一次找到最小元素 2,与第一个 5 交换位置,那第一个 5 和中间的 5 顺序就变了,所以选择排序是不稳定的排序算法

三、堆排序:

3.1-思路:

        对于堆排序,我们首先要将无序的数组建成大堆,大堆的话有助于排升序。因为大堆可以确定最大值,我们只需将首元素与尾元素交换,然后去除尾元素,继续进行向下调整,最后进行循环,直到排序完成为止。

3.2-过程图:

3.3-代码:


void AdjustDown(int* a, int len, int parent)			//向下调整---时间复杂度(O(logN))
{
	int child = parent * 2 + 1;

	while(child<len)
	{
		if (child+1<len && a[child] < a[child + 1])
		{
			++child;
		}
		if (a[child] > a[parent])
		{
			Swap(&a[parent], &a[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

void HeapSort(int* a, int len)			//堆排序---时间复杂度(O(N*logN))
{
	printf("原数组顺序:");
	for (int i = 0; i < len; i++)
	{
		printf("%d  ", a[i]);
	}
	printf("\n");
	//建大堆---时间复杂度(O(N))
	for (int i = (len - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(a, len, i);
	}
	printf("建堆后数组顺序:");
	for (int i = 0; i < len; i++)
	{
		printf("%d  ", a[i]);
	}
	printf("\n");
	//自我实现排序---时间复杂度(O(N*logN))
	int end = len-1;
	int n = 1;
	while(end>0)
	{
		Swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		--end;
		
		printf("第%d趟排序:",n++);
		for (int i = 0; i < len; i++)
		{
			printf("%d  ", a[i]);
		}
		printf("\n");
	}

}

3.4-效果图:

3.5-性质:

时间复杂度:

        由于向下调整函数的时间复杂度为O(logN),遍历数组的时间复杂度为O(N),所以堆排序的时间复杂度为O(N*logN)

空间复杂度:

        因为没开辟空间,所以空间复杂度为O(1)。

稳定性:

        堆排序是通过反复调整元素位置来完成排序的过程,其中涉及到交换操作。这些交换操作可能导致相同键值元素的相对顺序发生变化,因此堆排序是一个不稳定的排序算法

四、冒泡排序:

4.1-思路:

        通过对待排序序列从前向后(从下标较小的元素开始),依次对相邻两个元素的值进行两两比较,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就如果水底下的气泡一样逐渐向上冒。

4.2-过程图:

4.3-代码:


void BubbleSort(int* a, int len)			//冒泡排序---时间复杂度(O(N^2))
{
	printf("原数组顺序:");
	for (int i = 0; i < len; i++)
	{
		printf("%d  ", a[i]);
	}
	printf("\n");
	for (int j = 0; j < len - 1; j++)
	{
		int judge = 1;		//判断数组是否有序
		for (int i = 0; i < len - j-1; i++)
		{
			if (a[i] > a[i + 1])		
			{
				Swap(&a[i], &a[i + 1]);
				judge = 0;		//如果进循环说明无序令judge为0
			}
		}
		printf("第%d趟排序:", j + 1);
		for (int i = 0; i < len; i++)
		{
			printf("%d  ", a[i]);
		}
		printf("\n");
		if (judge)
		{
			return;
		}
		
	}
	
}

4.4-效果图:

4.5-性质:

时间复杂度:

        冒泡排序算法是一种基于比较的排序算法,每次冒泡过程,都会有一个数据确定位置。最坏的情况下需经过n-1次冒泡,就有n个数据确定了位置时间复杂度为O(N^2),但若是我们加入判断条件则最好的情况下可提前结束循环最好的情况下只需经过2次冒泡即可此时时间复杂度为O(N)

空间复杂度:

        因为没开辟空间,所以空间复杂度为O(1)。

稳定性:

        冒泡排序是相邻元素之间的比较,此时我们可以控制相同元素的位置,所以冒泡排序是稳定性的算法。

五、结语:

        上述内容,即是我个人对数据结构排序中选择排序、堆排序、冒泡排序的个人见解以及自我实现。若有大佬发现哪里有问题可以私信或评论指教一下我这个小萌新。非常感谢各位友友们的点赞,关注,收藏与支持,我会更加努力的学习编程语言,还望各位多多关照,让我们一起进步吧!

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

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

相关文章

【Datawhale AI夏令营】电力需求预测挑战赛 Task01

整个学习活动&#xff0c;将带你从 跑通最简的Baseline&#xff0c;到了解竞赛通用流程、深入各个竞赛环节&#xff0c;精读Baseline与进阶实践 文章目录 一、赛题背景二、赛题任务三、实践步骤学习规划分析思路常见时序场景 task01codecode 解读 一、赛题背景 随着全球经济的…

Python酷库之旅-第三方库Pandas(026)

目录 一、用法精讲 65、pandas.bdate_range函数 65-1、语法 65-2、参数 65-3、功能 65-4、返回值 65-5、说明 65-6、用法 65-6-1、数据准备 65-6-2、代码示例 65-6-3、结果输出 66、pandas.period_range函数 66-1、语法 66-2、参数 66-3、功能 66-4、返回值 6…

SoulApp创始人张璐团队以AI驱动社交进化,平台社交玩法大变革

在科技飞速发展的今天,人工智能正逐步渗透到社交媒体的各个环节,赋能全链路社交体验。AI的引入不仅提升了内容推荐的精准度,使用户能够更快速地发现感兴趣的内容,还能通过用户行为预测,帮助平台更好地理解和满足用户需求。此外,AI驱动的虚拟助手和聊天机器人也正在改变用户互动…

MATLAB quiver矢量图 设置colorbar

给三维矢量图按照不同高度设置箭头颜色 figure clf X surfaceuz(:,1); Y surfaceuz(:,2); Z surfaceuz(:,3); hold onzcolor jet; % qquiver3(X,Y,Z,X,Y,W) for i 1:length(surfaceuz)quiver3(X(i),Y(i),Z(i),X(i),Y(i), Z(i),...Color,zcolor(floor((Z(i) - -0.1) * 2…

在Mac上免费恢复误删除的Word文档

Microsoft Word for Mac是一个有用的文字处理应用程序&#xff0c;它与Microsoft Office套件捆绑在一起。该软件的稳定版本包括 Word 2019、2016、2011 等。 Word for Mac 与 Apple Pages 兼容;这允许在不同的操作系统版本中使用Word文档&#xff0c;而不会遇到任何麻烦。 与…

【异常解决】Unable to start embedded Tomcat Nacos 启动报错

Unable to start embedded Tomcat Nacos 启动报错解决方案 一、背景描述二、原因分析三、解决方案 一、背景描述 Windows 本地启动 Nacos&#xff08;2.2.0&#xff09; 服务&#xff0c;控制台报错 Unable to start embedded Tomcat。 报错信息&#xff1a;Unable to start …

AI绘画入门实践|Midjourney 提示词的使用技巧

提示词长短 尽可能做到简洁明了。 提示词很短 MJ 出图的随机性更高&#xff0c;创造的内容更有想象力&#xff0c;更适合创意发散的图像生成。 a dog 提示词很长 MJ 出图会更加精准&#xff0c;但描述太过详细&#xff0c;有可能出现AI理解不到位的情况。 越到后面的提示词&…

HTML+CSS+JS实现轮播图

效果&#xff1a; HTML: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>&l…

关于java的反射

❓❓❓反射是啥呀相信许多学java的同学非常困惑在学的时候&#xff0c;总是感觉懂了却又没懂或者直接忽略过去了&#xff0c;那么本文就带大家探讨一下什么是反射在java中以及它的机制和运用。 ⭐️什么是反射&#xff1a; 首先我们知道一些知识&#xff1a; 维基百科的解释 …

2024-07-15 Unity插件 Odin Inspector4 —— Collection Attributes

文章目录 1 说明2 集合相关特性2.1 DictionaryDrawerSettings2.2 ListDrawerSettings2.3 TableColumnWidth2.4 TableList2.5 TableMatrix 1 说明 ​ 本文介绍 Odin Inspector 插件中集合&#xff08;Dictionary、List&#xff09;相关特性的使用方法。 2 集合相关特性 2.1 D…

《Programming from the Ground Up》阅读笔记:p49-p74

《Programming from the Ground Up》学习第3天&#xff0c;p49-p74总结&#xff0c;总计26页。 一、技术总结 1.function (1)定义 p49, Functions are unit of code that do a defined piece of work on specified types of data。 函数是在指定类型的数据上完成所定义的某…

【Qt 常用控件】

文章目录 1. Push Button 1. Push Button &#x1f427;给按钮设置图标

供应链管理(SCM):如何在颜值和体验上发力

要在供应链管理系统&#xff08;SCM&#xff09;中在颜值和体验上发力&#xff0c;让用户感觉耳目一新&#xff0c;可以采取以下措施&#xff1a; 界面设计优化&#xff1a; 对供应链管理系统的界面进行优化&#xff0c;注重界面的美观、简洁和易用性。采用现代化的设计风格、…

Catena-x标准解读:CX-0001 EDC Discovery API v1.0.2 EDC发现API

随着Catena-X网络的扩展&#xff0c;大量数据资产将通过EDC连接技术提供。在网络中有效地识别正确的EDC端点可能很困难。 为了符合GAIA-X标准&#xff0c;每个EDC端点必须提供ServiceOffering类型的自我描述&#xff08;SD&#xff09;。基于这些SD&#xff0c;必须提供数据和…

可视化作品集(14)智慧旅游和智慧景区,洞悉一切。

智慧旅游和智慧景区的可视化大屏可以带来以下几个方面的好处&#xff1a; 1. 提升游客体验&#xff1a; 通过可视化大屏&#xff0c;游客可以方便地获取到景区地图、交通信息、景点介绍、活动安排等信息&#xff0c;帮助游客更好地规划行程&#xff0c;提升游览体验。 2. 提供…

手写new

手写new new是什么执行new会发生什么实现new new是什么 new 操作符是可以创建一个用户定义的对象的实例或具有构造函数的内置对象的实例 function Car (make, model, year) {this.make makethis.model modelthis.year year } Car.prototype.running function () {return …

Zynq系列FPGA实现SDI编解码转SFP光口传输(光端机),基于GTX高速接口,提供6套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案在Xilinx-Kintex7上的应用 3、详细设计方案设计原理框图输入Sensor之-->OV5640摄像头输入Sensor之-->HDMIVDMA图像缓存RGB转BT1120GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGBHDMI输…

实习随笔【iviews的Select实现‘与全部互斥’的多选】

在实习中&#xff0c;遇到了如下需求&#xff0c;要求如下&#xff1a; 上面提到了一个需求为&#xff0c;选择全部与选择一个或者多个互斥&#xff0c;我们来看一下如何解决 核心代码 监听value的变化&#xff0c;如果含有‘全部’&#xff0c;且数组长度>1&#xff0c;则删…

Redis面试问题一

Redis在面试中有很大的概率会问到&#xff0c;因此我们一定要学会回答此方面的问题。 Redis主要涉及到使用场景已经一些其他方面的问题。 下面是有可能涉及到的问题。 问题一&#xff1a;你最近的项目中那些场景用到了Redis呢&#xff1f; 需要结合简历项目上的业务进行具体…

Rust 通过 Deref trait 将智能指针当作常规引用处理

通过 Deref trait 将智能指针当作常规引用处理 实现 Deref trait 允许我们重载 解引用运算符&#xff08;dereference operator&#xff09;*&#xff08;与乘法运算符或通配符相区别&#xff09;。通过这种方式实现 Deref trait 的智能指针可以被当作常规引用来对待&#xff…