C语言数据结构排序、插入排序、希尔排序(多组并排、一组排完排另一组)、选择排序、堆排序、冒泡排序等的介绍

文章目录

  • 前言
  • 打印数组函数
  • 一、插入排序
  • 二、希尔排序
  • 三、选择排序
  • 四、堆排序
  • 五、冒泡排序
  • 总结

前言

C语言数据结构排序、插入排序、希尔排序(多组并排、一组排完排另一组)、选择排序、堆排序、冒泡排序等的介绍


打印数组函数

打印数组函数定义

// 打印数组
void PrintArray(int* a, int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}

一、插入排序

插入排序定义

// 插入排序------升序
void InsertSort(int* a, int n)
{
	int i = 0;
	for (i = 1; i < n; i++)
	{
		int end = i - 1;
		int tmp = a[end + 1];

		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

插入排序测试

void TestInsertSort()
{
	int a[] = { 9, 6, 5, 7, 3, 1, 4, 2, 8, 0 };

	int sz = sizeof(a) / sizeof(a[0]);

	PrintArray(a, sz);

	InsertSort(a, sz);

	PrintArray(a, sz);
}

效果如下:
在这里插入图片描述

二、希尔排序

  • 希尔排序的思想是先分组,进行预排序,使数组趋向于有序。

  • 然后进行逐步减小分组的跨度,直至分组跨度为1,变为有序排序。
    在这里插入图片描述

  • 如上图所示,先进行分组,在组内进行排序。

  • 希尔排序可以有两种方式

  1. 一组排完再排另一组

希尔排序定义

// 希尔排序
void ShellSort(int* a, int n)
{
	int gap = n;
	
	while (gap > 1)
	{
		gap /= 2;

		int j = 0;
		for (j = 0; j < gap; j++)
		{
			int i = 0;
			for (i = gap + j; i < n; i += gap)
			{
				int end = i - gap;
				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;
			}
		}

	}	
}

希尔排序测试

void TestShellSort()
{
	int a[] = { 9, 7, 6 ,4 ,8 ,3 ,5 ,1 ,2, 0 };

	PrintArray(a, sizeof(a) / sizeof(a[0]));

	ShellSort(a, sizeof(a) / sizeof(a[0]));

	PrintArray(a, sizeof(a) / sizeof(a[0]));

}

效果如下:
在这里插入图片描述

  1. 多组并排----每次排一组的一个数

希尔排序定义

// 希尔排序---- 多组并排
void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap /= 2;

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

希尔排序测试

void TestShellSort()
{
	int a[] = { 9, 7, 6 ,4 ,8 ,3 ,5 ,1 ,2, 0 };

	PrintArray(a, sizeof(a) / sizeof(a[0]));

	ShellSort(a, sizeof(a) / sizeof(a[0]));

	PrintArray(a, sizeof(a) / sizeof(a[0]));

}

效果如下:
在这里插入图片描述

  • 希尔排序的时间复杂度差不多是 O(N1.3 ).

三、选择排序

选择排序定义

void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

// 选择排序
void SelectSort(int* a, int n)
{
	int left = 0;
	int right = n - 1;

	while (left < right)
	{

		int maxi = left;
		int mini = left;

		int i = 0;
		for (i = left + 1; i <= right; i++)
		{
			if (a[i] < a[mini])
				mini = i;
			if (a[i] > a[maxi])
				maxi = i;
		}

		Swap(&a[left], &a[mini]);
		if (left == maxi)
		{
			maxi = mini;
		}
		Swap(&a[right], &a[maxi]);

		left++;
		right--;
	}
}

选择排序测试

void TestSelectSort()
{
	int a[] = { 9, 2, 6, 8, 4, 7, 5, 3, 1, 0 };
	int sz = sizeof(a) / sizeof(a[0]);

	PrintArray(a, sz);
	SelectSort(a, sz);
	PrintArray(a, sz);
}

效果如下:
在这里插入图片描述

四、堆排序

堆排序定义

void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

// 向下调整建堆
// 升序建大堆
void AdjustDown(int* a, int n, int parent)
{
	int child = parent * 2 + 1;
	while (child < n)
	{

		if (child + 1 < n && a[child] < a[child + 1])
		{
			child++;
		}

		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
		}

		parent = child;
		child = parent * 2 + 1;
	}

}

// 堆排序
void HeapSort(int* a, int n)
{
	// 建堆----向下调整建堆

	int i = 0;
	for(i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(a, n, i);
	}

	// 堆排序
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		end--;
		AdjustDown(a, end+1, 0);
	}

}

堆排序测试

void TestHeapSort()
{
	int a[] = { 9, 2, 6, 8, 4, 7, 5, 3, 1, 0 };
	int sz = sizeof(a) / sizeof(a[0]);

	PrintArray(a, sz);
	HeapSort(a, sz);
	PrintArray(a, sz);
}

效果如下:
在这里插入图片描述

五、冒泡排序

冒泡排序定义

void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

// 冒泡排序
void BubbleSort(int* a, int n)
{
	int j = 0;
	for (j = 0; j < n - 1; j++)
	{
		int i = 0;
		for (i = 0; i < n - 1- j; i++)
		{
			if (a[i] > a[i + 1])  
			{
				Swap(&a[i], &a[i + 1]);
			}
		}
	}
	
}

冒泡排序测试

void TestBubbleSort()
{
	int a[] = { 9, 2, 6, 8, 4, 7, 5, 3, 1, 0 };
	int sz = sizeof(a) / sizeof(a[0]);

	PrintArray(a, sz);
	BubbleSort(a, sz);
	PrintArray(a, sz);
}

效果如下:
在这里插入图片描述


总结

C语言数据结构排序、插入排序、希尔排序(多组并排、一组排完排另一组)、选择排序、堆排序、冒泡排序等的介绍

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Angular17(1):使用Angular CLI创建空项目

要创建一个空的 Angular 项目&#xff0c;可以使用 Angular CLI&#xff08;命令行界面&#xff09;。以下是使用 Angular CLI 创建一个新项目的步骤&#xff1a; 1、安装 Angular CLI&#xff1a; 打开你的命令行界面&#xff08;在 Windows 上是 CMD、PowerShell 或 Git Bas…

反向海淘代购系统|pandabuy系统方案|系统流程讲解:引领全球购物新潮流

随着全球化的深入发展和互联网技术的不断进步&#xff0c;人们的购物方式也在发生着翻天覆地的变化。反向海淘代购系统作为这一变革的杰出代表&#xff0c;正逐渐走进大众视野&#xff0c;为消费者带来前所未有的全球购物体验。 一、反向海淘代购系统的定义 传统的海淘模式主…

【网络通信层】华为云连接MQTT设备

本文介绍华为云设备连接到设备的操作。 目录 一、在华为云创建设备 二、连接MQTT 三、通信 一、在华为云创建设备 现在华为云上可以免费使用部分受限服务&#xff0c;包括免费创建自己的设备连接。 首先&#xff0c;登录华为云平台共建智能世界云底座-华为云 (huaweicl…

Flink SQL查询语法部分详解(提供需求、数据练习复现)

一、Hints 动态表选择&#xff1a;可以在查询表的时候动态修改表的参数配置 1、读取kafka的数据建表 CREATE TABLE students (id STRING,name STRING,age INT,sex STRING,clazz STRING ) WITH (connector kafka,topic students, -- 指定topicproperties.bootstrap.servers …

root账号,cmd命令行能用ssh连上服务器,但是vscode连接报错Permission denied,please try again

☆ 问题描述 但是cmd能连接上 ★ 解决方案 点击 然后add到自己的配置文件下 重新选择 这个时候就会出现刚刚添加的&#xff0c;点击选择 输入密码 然后就ok了 ✅ 总结 只能说&#xff1a;玄学&#xff01;

美洽工作台3.0,全新发布!

美洽工作台3.0&#xff0c;全新发布 想要效率翻倍&#xff0c;就要一步到位&#xff01; 工作台 3.0&#xff0c;为效率而生 1. 更丰富的外观选择&#xff0c;让界面焕然一新&#xff0c;新增导航主题色选择&#xff0c;深色 Dark、浅色 Light 随意切换 2. 自定义你的专属导…

以真机算力剑指实用化!这家中国量子计算公司的应用探索

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙/王珩 排版丨沛贤 深度好文&#xff1a;1500字丨5分钟阅读 近些年来&#xff0c;由于底层物理的限制&#xff0c;经典集成电路通过缩小工艺制程提升算力的路线正在逼近极限&#xf…

RK3568技术笔记之一 RK3568总体介绍

RK3568是瑞芯微开发出一款很好用的芯片。我先把ROCKCHIP的原厂信息搬过来看看。 首先声明一下&#xff0c;这篇文章里的资讯版权归瑞芯微电子股份有限公司。毕竟是我转过来的嘛。 我自己的心得&#xff0c;版权就归我啦。 搬砖地址Rockchip-瑞芯微电子股份有限公司瑞芯微专注…

Django项目上线-报错汇总

Django项目上线-报错汇总 下列报错基本都是Python环境相关 pip install 报错 WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. debian运行pip报错ssl module in Python is not available - z417 - 博…

Javaweb基础之json

大家好&#xff0c;这里是教授.F 目录 引入&#xff1a; 定义格式&#xff1a; json规制&#xff1a; 字符串转json&#xff1a; json转字符串: 字符串和json转化细节&#xff1a; json在java中的使用: 应用实例&#xff1a; JavaBean和json字符串的转换&#xff1a; l…

解决ESP-IDF工程里面C/C++找不到路径标红的问题

解决ESP-IDF工程里面C/C找不到路径标红的问题 教程 源文件 打开这一个文件 {"configurations": [{"name": "ESP-IDF","cStandard": "c11","cppStandard": "c17","compileCommands": "…

论文AI率过高?掌握这四种技巧轻松降重

随着人工智能技术的突飞猛进&#xff0c;AI生成内容&#xff08;AIGC&#xff09;已被广泛用于学术论文撰写中&#xff0c;提高效率同时也带来了原创性的挑战。面对日益严格的学术审查&#xff0c;一个突出的问题是&#xff1a;使用AI代写的论文能否通过内容检测&#xff1f;因…

【数据结构】图论中求最短路径——迪杰斯特拉算法(Dijkstra)、弗洛伊德算法(Floyd)

目录 最短路径 (*)迪杰斯特拉算法&#xff08;Dijkstra&#xff09;迪杰斯特拉算法&#xff08;Dijkstra&#xff09;的算法原理&#xff1a; 弗洛伊德算法&#xff08;Floyd&#xff09;弗洛伊德算法&#xff08;Floyd&#xff09;的算法原理&#xff1a;弗洛伊德算法的&#…

导弹研究中常用坐标系及坐标系之间的变换

在导弹飞行控制过程中&#xff0c;需要时刻掌握导弹的飞行状态 &#xff08;速度、位置、姿态角等&#xff09;&#xff0c;这就有赖于描述导弹飞行状态的坐标系。除了大地坐标系和地心大地直角坐标系外&#xff0c;导弹常用的坐标系还有很多&#xff0c;合理而恰当地选择参考系…

【LangChain系列】第二篇:文档拆分简介及实践

在上一篇博客中&#xff0c;我们学习了如何使用LangChain的文档加载器将文档加载为标准格式。加载文档后&#xff0c;下一步是将它们拆分为更小的块。这个过程乍一看似乎很简单&#xff0c;但有一些微妙之处和重要的考虑因素会显着影响下游任务的性能和准确性。 一、为什么文档…

qcom 平台系统签名流程

security boot 平台的东东&#xff0c;oem 可定制的功能有限&#xff0c;只能参考平台文档&#xff0c;可以在高通的网站上搜索&#xff1a;Secure Boot Enablement&#xff0c;然后找对应平台的文档xxx-Secure Boot Enablement User Guide, step by step 操作即可 开机校验流…

【人工智能】第五部分:ChatGPT的实际应用案例和未来发展方向

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

【成品设计】基于STM32的体温监控系统的设计与实现

《基于STM32的体温监控系统的设计与实现》 整体功能&#xff1a; 体温监控系统采用STM32F103VET6单片机为主控&#xff0c;在此基础上移植了一款国产嵌入式操作系统RT-thread进行开发设计的。 该系统的主要工作逻辑为&#xff1a;管理员可先将相关人员的指纹、ID等数据录入系…

AC/DC电源模块的效率如何?

BOSHIDA AC/DC电源模块的效率如何&#xff1f; AC/DC电源模块是一种将交流电转换为直流电的装置&#xff0c;常用于电子设备的电源部分。其效率是指输入电功率与输出电功率的比值&#xff0c;通常以百分比表示。AC/DC电源模块的效率主要取决于以下几个因素&#xff1a;开关频…

EE trade:如何在A股市场中有效设定止盈止损点

A股市场充满机遇和风险&#xff0c;很多投资者在这里实现了财富增长&#xff0c;也有投资者在这里遭受损失。如何在波动性较大的市场中&#xff0c;控制风险&#xff0c;保护利润和本金?止盈止损是关键。 什么是止盈止损? 止盈止损是指在交易中&#xff0c;根据预先设定的条…