算法:排序

排序算法

  • 1. 简单排序
    • 1.1 直接插入排序
    • 1.2 冒泡排序
    • 1.3 简单选择排序
  • 2. 希尔排序
  • 3. 快速排序
  • 4. 堆排序
  • 5. 归并排序

将文件的内容按照某种规则进行排列。

排序算法的稳定判定:若在待排序的一个序列中, R i R_i Ri R j R_j Rj的关键码相同,即 k i = k j k_i=k_j ki=kj,且在排序前 R i R_i Ri领先于 R j R_j Rj,那么当排序后,如果 R i R_i Ri R j R_j Rj的相对次序保持不变, R i R_i Ri仍领先于 R j R_j Rj,则称此类排序方法为稳定的。若可能出现 R j R_j Rj领先于 R i R_i Ri的情况,则称此列排序是不稳定的。

排序可分为内部排序和外部排序,通过是否全部在内存中排序进行判定。

排序完成两个操作:

  1. 比较两个关键码的大小;
  2. 将记录从一个位置移动到另一个为止。

1. 简单排序

1.1 直接插入排序

将某个数据插入已经排好的队列中。

void insertSort(int data[], int n)
{
    int i, j;
    int temp;
    for (i = 1; i < n; i++)
    {
        if (data[i] < data[i - 1]) {
            temp = data[i]; data[i] = data[i - 1];
            for (j = i - 2; j >= 0 && data[j] > temp; j--) data[j + 1] = data[j];
            data[j+1] = temp;
        }
    }
}

运行结果:

int array[8] = {12, 18184, 45, 78, 45, 555, 47, 36};

insertSort(array, 8);

for (int i = 0; i < 8; i++)
{
	printf("%d\n", array[i]);
}

在这里插入图片描述
直接插入排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)。排序过程中仅需要一个元素的辅助空间,空间复杂度为 O ( 1 ) O(1) O(1)。直接插入排序是一种稳定的排序方法。

1.2 冒泡排序

顾名思义,冒泡法就是像气泡上浮一样把数据逐渐传递上去。

void bubbleSort(int data[], int n) 
{
	int i, j, tag = 1;   //tag表示排序过程中是否交换过元素值
	int temp;
	for (i = 1; tag && i < n; i++)
	{
		tag = 0;
		for (j = 0; j < n - i; j++)
		{
			if (data[j]>data[j+1])
			{
				temp = data[j];
				data[j] = data[j+1];
				data[j + 1] = temp;
				tag = 1;
			}
		}
	}
}
int array[8] = {12, 18184, 45, 78, 45, 555, 47, 36};
//insertSort(array, 8);
bubbleSort(array, 8);

for (int i = 0; i < 8; i++)
{
	printf("%d\n", array[i]);
}

在这里插入图片描述
冒泡排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)。排序过程中仅需要一个元素的辅助空间,空间复杂度为 O ( 1 ) O(1) O(1)。冒泡排序是一种稳定的排序方法。

1.3 简单选择排序

逐步找出最小的元素,依次放置。

void selectSort(int data[], int n)
{
	int i, j, k;
	int temp;
	for (i = 0;  i < n-1; i++)
	{
		k = i;
		for ( j = i+1; j < n; j++)
		{
			if (data[j] < data[k]) k = j;
		}
		if (k!=i)
		{
			temp = data[i];
			data[i] = data[k];
			data[k] = temp;
		}
	}
}

算法结果:

int array[8] = {12, 18184, 45, 78, 45, 555, 47, 36};

//insertSort(array, 8);
//bubbleSort(array, 8);
selectSort(array, 8);

for (int i = 0; i < 8; i++)
{
	printf("%d\n", array[i]);
}

在这里插入图片描述
简单选择排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)。排序过程中仅需要一个元素的辅助空间,空间复杂度为 O ( 1 ) O(1) O(1)。简单选择排序是一种不稳定的排序方法。

2. 希尔排序

希尔排序又称为“缩小增量排序”,是对直接插入排序方法的改进。
希尔排序的基本思想是:先将整个待排记录序列分割成若干子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。具体做法是先取一个小于n的整数 d 1 d_1 d1作为第一个增量,将所有相距为 d 1 d_1 d1的记录放在同一个组中,从而把文件的全部记录分成 d 1 d_1 d1组,在各组内进行直接插入排序;然后取第二个增量 d 2 ( d 2 < d 1 ) d_2(d_2<d_1) d2(d2<d1),重复上述分组和排序工作,依此类推,直至所取的增量 d i = 1 ( d i < d i − 1 < . . . < d 2 < d 1 ) d_i=1(d_i<d_{i-1}<...<d_2<d_1) di=1(di<di1<...<d2<d1),即所有记录放在同一组进行直接插入排序,将所有记录排列有序为止。
在这里插入图片描述

/*************************************************
	Function:shellSort,希尔排序方法
	Description: 整数序列排序,从小到大
	Input:    data[]   排序数组
			  n        数组大小
			  delta[]  长度为m且递减有序的增量序列最后一个元素为1
			  m   delta[]数组大小
	Output:输出转换结果
	Return: 0
*************************************************/
void shellSort(int data[], int n, int delta[], int m)
{
	int k, i, dk, j; int temp;
	for ( i = 0; i < m; i++)
	{
		dk = delta[i];
		for (k = dk; k < n; ++k)
		{
			if (data[k]<data[k-dk])
			{
				temp = data[k];
				for (j = k - dk; j>0&&temp<data[j]; j-=dk)
				{
					data[j + dk] = data[j];
				}
				data[j + dk] = temp;
			}
		}
	}
}

希尔排序的时间复杂度为 O ( N 1.3 ) O(N^{1.3}) O(N1.3).希尔排序是不稳定的排序方法。

3. 快速排序

快速排序

一趟快速排序的过程称为一次划分,具体做法是:附设两个元素位置指示变量 i i i j j j,它们的初值分别指向待排序列的第一个记录和最后一个记录。设枢轴记录(通常是第一个记录)的关键码为 pivot,则首先从j所给位置起向前搜索,找到第一个关键码小于 pivot 的记录时停止,然后从i所给位置起向后搜索,找到第一个关键码大于pivot 的记录时停止,此时交换j所给位置和i所给位置的元素,重复该过程直至i与i相等为止,完成一趟划分。

//用data[low]的值作为枢轴元素pivot进行划分
//不断劈成两半之后排序
int partition(int data[], int low, int high)
{
	int i, j;
	int pivot;
	while (i<j)
	{
		while (i<j&&data[j]>=pivot)
		{
			j--;
		}
		data[i] = data[j];
		while (i < j && data[i] <= pivot)
		{
			i++;
		}
		data[j] = data[i];
	}
	data[i] = pivot;
	return i;
}

/*************************************************
	Function:quickSort,快速排序方法
	Description: 整数序列排序,从小到大
	Input:    data[]   排序数组
			  low  数组最低位
			  high 数组最高位
	Output:输出转换结果
	Return: 0
*************************************************/
void quickSort(int data[], int low, int high)
{
	if (low < high)
	{
		int loc = partition(data, low, high);
		quickSort(data,low,loc-1);
		quickSort(data,  loc + 1, high);
	}
}

4. 堆排序

5. 归并排序

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

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

相关文章

docker部署手册(离线)

文章目录 一、下载地址二、部署环境三、安装部署3.1 上传安装包3.2 解压3.3 创建docker.service3.4 创建daemon.json 文件3.5 授权3.6 启动3.7 查看信息3.8 设置开机启动3.9 允许远程连接到docker方法一&#xff1a;修改docker.service方法二&#xff1a;修改daemon.json 3.10 …

OpenWRT旁路由应该怎么设置?每一步都给你指出来!

前言 小白最近家里的网络出了问题&#xff0c;于是折腾了好多次路由器&#xff08;软路由系统重装&#xff09;&#xff0c;这样直接就影响到其他小伙伴的网络了。 为了不影响其他小伙伴赚钱&#xff0c;小白就想着在软路由&#xff08;主路由系统&#xff09;旁边再加个软路…

LaTeX 特殊符号、加帽子符号、横线和波浪线、绝对值符号

LaTeX 特殊符号、加帽子符号、横线和波浪线_latex hat-CSDN博客 1 加帽子 \hat{E} \widehat{E} 2 加绝对值 % L1公式 \begin{align}L_{reg} \begin{cases}0.5(E^{}-\widehat{E})^{2} & \text{if } $$\left| g-\widehat{g}\right|$$<1 $$ \\$$\left| E^{}-\widehat{…

贷中额度策略调整

用户使用金融产品后&#xff0c;就会产生一些数据&#xff0c;比如&#xff1a;使用APP的行为数据&#xff0c;这个可以通过埋点进行收集&#xff0c;或借贷行为数据&#xff0c;是否逾期等。为了给用户更好的产品体验和提升风险防范水平&#xff0c;策略同学就会对存量的用户进…

统信UOS下启动图形界面应用工具manager报错:No protocol specified的解决办法

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、问题情况 达梦提供了丰富的图形界面工具&#xff0c;包括&#xff1a;manager、monitor、dbca等&#xff0c;但在统信操作系统进入终端去启动manager时报错&#xff1a;No protocol specified。 咨询了达…

【论文阅读】ESRGAN+

学习资料 论文题目&#xff1a;进一步改进增强型超分辨率生成对抗网络&#xff08;ESRGAN : FURTHER IMPROVING ENHANCED SUPER-RESOLUTION GENERATIVE ADVERSARIAL NETWORK&#xff09;论文地址&#xff1a;2001.08073代码&#xff1a;ncarraz/ESRGANplus&#xff1a; ICASSP …

优秀的服务器性能要看哪些方面

服务器性能指标主要看的是速度和稳定性&#xff0c;服务器的性能要求是什么&#xff1f;服务器的多处理器特性、内存容量、磁盘性能及可扩展性是选择服务器要考虑的主要因素。互联网时代的发展服务器的种类也越来越多。 服务器的性能要求是什么&#xff1f; 运行服务器软件的…

YOLOv9模型重新参数化,将yolo.pt转为yolo-converted.pt

1、yolo-m转为yolo-m-converted 在我们使用train_dual.py训练好自己的模型后&#xff0c;我们会得到yolo系列的模型&#xff0c;比如我使用yolov9-m在数据集CityScapes上训练后&#xff0c;得到cityscapes-yolov9-m.pt&#xff0c;然后运行yolov9-m_to_converted.py代码得到ci…

LC20. 有效的括号

用来熟悉一下栈的应用之括号匹配 题目链接 下面是大致思路 1.初始化:创建一个空栈,用于存储左括号。&#xff08;LC这题不用&#xff0c;自己写完整的需要&#xff09; 2.遍历字符串:从左到右依次扫描字符串中的每个字符。 3.处理左括号:如果是左括号,将其压入栈中。 4.处理右…

C# 企业微信机器人推送消息 windows服务应用程序的使用

C# 企业微信机器人推送消息 先添加一个机器人! 然后查看机器人就可以得到一个 webhook 特别特别要注意&#xff1a;一定要保护好机器人的webhook地址&#xff0c;避免泄漏&#xff01; 然后开始写代码 &#xff0c;只需要httpPost 调用一下这个地址就可以发送消息了。 首先我…

ctfshow(159->162)--文件上传漏洞

Web159 考点&#xff1a; 前端校验MIME验证黑名单 思路&#xff1a; 上传.user.ini文件&#xff1a; 文件内容auto_prepend_fileshell.png 由于网页存在前端过滤&#xff0c;只允许上传.png文件,所以我们将文件名修改为.user.ini.png上传&#xff0c;然后抓包删除.png后缀名…

《模拟电子技术基础》第六版PDF课后题答案详解

《模拟电子技术基础》第六版是在获首届全国优秀教材建设奖一等奖的第五版的基础上&#xff0c;总结6年来的教学实践经验修订而成的新形态教材。为满足国家人才培养的需求&#xff0c;适应新型教学模式&#xff0c;并考虑到大多数院校逐渐减少课程学时的现状&#xff0c;在不降低…

ComfyUI EcomID: 阿里开源助力定制化个性图像生成,单图生成高相似度图像

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

LabVIEW涡扇发动机加力泵测试

LabVIEW软件开发的涡扇发动机加力泵测试平台采用高度集成的硬件设备&#xff0c;实现了对涡扇发动机加力泵的全面测试和分析&#xff0c;从而确保其性能满足严格的航空标准。 项目背景 涡扇发动机是现代飞机的重要动力来源之一&#xff0c;其加力泵的性能直接影响飞机的整体动…

关于我的数据库——MySQL——第二篇

&#xff08;叠甲&#xff1a;如有侵权请联系&#xff0c;内容都是自己学习的总结&#xff0c;一定不全面&#xff0c;仅当互相交流&#xff08;轻点骂&#xff09;我也只是站在巨人肩膀上的一个小卡拉米&#xff0c;已老实&#xff0c;求放过&#xff09;。 表的操作 创建表…

练习LabVIEW第二十八题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第二十八题&#xff1a; 建立一个VI&#xff0c;模拟滚动—个骰子(骰子取值1~6)&#xff0c;跟踪骰子滚动后的取值出现次数…

xhr的readyState和status

XMLHttpRequest&#xff08;XHR&#xff09;对象中的readyState和status用于监控异步 HTTP 请求的状态。它们分别表示请求的当前阶段和服务器的响应状态。 readyState 用于判断请求所处的阶段&#xff0c;确保数据完全接收。 status 用于判断请求的结果状态&#xff08;如200表…

计算机网络IP地址分类,子网掩码,子网划分复习资料

IP 地址的概念 IP 地址是独立于硬件地址的逻辑地址&#xff0c;它是由软件提供的地址。 IP 地址是网络层地址。 IP 编址方案和分类 IP 地址由 32 位二进制数构成&#xff0c;分为前缀(网络地址)和后缀(主机地址) 同一网段中每台计算机的 IP 地址是唯一的网络地址的分配全球…

【Stable Diffusion】

1、SD 模型 安装完SD软件后&#xff0c;必须搭配基础模型才能使用。 不同的基础模型&#xff0c;其画风和擅长的领域会有侧重。 Checkpoint大模型 大模型是 SD 的核心&#xff0c;用来控制生成图片的整个画面风格走势。 出图前要选择好合适的大模型&#xff0c;比如有些擅长…

WPF+MVVM案例实战(一)- 设备状态LED灯变化实现

文章目录 1、项目创建2、UI界面布局1. MainWindow.xaml2、颜色转换器实现2.MainViewModel.cs 代码实现3、运行效果4.源代码下载1、项目创建 打开 VS2022 ,新建项目 Wpf_Examples,创建各层级文件夹,安装 CommunityToolkit.Mvvm 和 Microsoft.Extensions.DependencyInjectio …