007+limou+C语言基础排序算法(上)

news2024/10/5 6:46:15

0.前言

您好这里是limou3434的一篇博文,感兴趣可以看看我的其他内容。

排序算法简单理解就是:一串数组经过排序算法后得到有序的数组。排序算法在不同应用场景有不同的效果,因此我们有必要了解一些基础的排序算法。

而本次我给您带来的是一些基础的排序算法,主要涉及四种排序算法:插入排序、选择排序、交换排序、归并排序。

在这里插入图片描述

1.插入排序

1.1.直接插入排序

1.1.1.排序思想

在[0,end]有序的前提下,保证插入tmp后依旧有序。

1.1.2.具体code与test用例

#include <stdio.h>
void InsertSort(int* arr, int arrSize)
{
	for(int i = 0; i < arrSize; i++)
	{
		int end = i-1;
		int tmp = arr[i];
		while (end >= 0)
		{
			if (tmp < arr[end])
			{
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
				break;
			}
		}
		arr[end + 1] = tmp;
	}
}
void test(void)
{
	int arr[10];
	srand((unsigned)time(0));
	printf("排序前:");
	for (int i = 0; i < 10; i++)
	{
		arr[i] = rand() % 10;
		printf("%d ", arr[i]);
	}
	printf("\n排序后:");
	InsertSort(arr, 10);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	test();
	return 0;
}

1.1.3.算法复杂度分析

在最坏情况下,每次tmp进来都需要把索引[0,end]的数据往后挪动,总共挪动的次数是“0+1+2+…+(n-1)=((0+n-1)*(n))/2”,即时间复杂度为O(n^2)。

1.2.希尔排序

1.2.1.排序思想

希尔排序的思想就是:先对数据进行预排序,然后进行直接插入排序。

详细的思路就是:假设有一个值gap,将数据间隔gap分为一组,然后对每一组分别进行直接插入排序,因此这里可以复用之前的直接插入排序代码。

写希尔排序最好先写直接插入排序,然后改写为希尔排序(就是把1改成gap),最后得到预排序数组。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2.2.具体code与test用例

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include <stdio.h>
#define SIZE 100
void InsertSort(int* arr, int arrSize)//插入排序的实现
{
	for (int i = 0; i < arrSize; i++)
	{
		int end = i - 1;
		int tmp = arr[i];
		while (end >= 0)
		{
			if (tmp < arr[end])
			{
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
				break;
			}
		}
		arr[end + 1] = tmp;
	}
}
void ShellSort(int* arr, int arrSize)//希尔排序的实现
{
	//0.gap的最大意义在于:让最大的数更快跳到后面,让更小的数更快跳到前面
	//0.1.gap越大越不接近有序,但是跳得快
	//0.2.gap越小越接近有序,特别当gap=1时,其效果等价于直接插入排序

	//1.写法一(单组单排)
	//for (int gap = arrSize/2; gap >= 1; gap /= 2)//1.3.控制gap的大小
	//{
	//	for (int j = 0; j < gap; j++)//1.2.分别使用“直接插入排序”排序gap组个数组
	//	{
	//		for (int i = j; i < arrSize; i += gap)
	//		{
	//			//1.1.某一次一组的“直接插入排序”
	//			int end = i - gap;
	//			int tmp = arr[i];
	//			while (end >= 0)
	//			{
	//				if (tmp < arr[end])
	//				{
	//					arr[end + gap] = arr[end];
	//					end -= gap;
	//				}
	//				else
	//				{
	//					break;
	//				}
	//			}
	//			arr[end + gap] = tmp;
	//		}
	//	}
	//}
	
	//2.写法二(多组同排,但是效率没有变化)
	int gap = arrSize;
	while(gap > 1)//2.3.控制gap的大小(注意这里得入口不能写等于,会因为条件“gap=gap/3+1”而死循环,这是代码设计导致的)
	{
		gap = gap / 3 + 1;//加1是为了保证最后一次是1,能用上gap=1的直接插入排序
		for (int i = 0; i < arrSize; i++)//2.2.每组只取一个元素排序
		{
			//2.1.“直接插入排序”代码 
			int end = i - gap;
			int tmp = arr[i];
			while (end >= 0)
			{
				if (tmp < arr[end])
				{
					arr[end + gap] = arr[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			arr[end + gap] = tmp;
		}
	}
}
void Test1()
{
	int arr[SIZE] = { 0 };
	for (int i = 0; i < SIZE; i++)
	{
		arr[i] = rand() % 10;
	}
	for (int i = 0; i < SIZE; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	printf("InsertSort() :");
	InsertSort(arr, SIZE);
	for (int i = 0; i < SIZE; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n\n");
}
void Test2()
{
	int arr[SIZE] = { 0 };
	for (int i = 0; i < SIZE; i++)
	{
		arr[i] = rand() % 10;
	}
	for (int i = 0; i < SIZE; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	printf("ShellSort()  :");
	ShellSort(arr, SIZE);
	for (int i = 0; i < SIZE; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n\n");
}
int main()
{
	Test1();
	Test2();
	return 0;
}

1.2.3.算法复杂度分析

希尔排序的算法复杂度分析不能只看for循环,这是极其错误的,一个典型的例子就是:我们在写希尔排序的时候,写了“四层循环”和“三层循环”的方法,但是两种方法的效果是一样的。

在这里插入图片描述

以博主的数学知识是没有办法进行计算的(貌似在数学界也有些问题没有被解决),所以暂时跳过吧。我们只需要记住希尔排序的时间复杂度范围在[O(N*(log(2)(N))2),O(N2)]之间即可,整体认为希尔排序的时间复杂度是O(N^1.3)即可。

2.选择排序

2.1.直接选择排序

2.1.1.排序思想

从一个待排序列中选出最小/最大的数,然后将最小/最大的数和待排序列中的第一个数/最后一个数交换,不断重复。

但是这样效率太低,可以优化一下:从一个待排序列中选出最小的数和最大的数,然后将最小的数和最大的数分别和待排序列中的第一个数和最后一个数交换,不断重复,效率好了一倍。

2.1.2.具体code与test样例

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include <stdio.h>
#define SIZE 10
void _Swap(int* px, int* py)
{
	int tmp = *px;
	*px = *py;
	*py = tmp;
}
void SelectSort(int* arr, int arrSize)
{
	int begin = 0, end = arrSize - 1;
	while (begin < end)
	{
		int maxi = begin;
		int mini = end;
		for (int i = begin; i <= end; i++)
		{
			if (arr[i] > arr[maxi])//选出最大数的下标
			{
				maxi = i;
			}
			if (arr[i] < arr[mini])//选出最小数的下标
			{
				mini = i;
			}
		}
		_Swap(&arr[begin], &arr[mini]);
		if (begin == maxi)//处理特殊情况
		{
			maxi = mini;
		}
		_Swap(&arr[end], &arr[maxi]);
		begin++;
		end--;
	}
}
int main()
{
  	int arr[SIZE] = { 0 };
	for (int i = 0; i < SIZE; i++)
	{
		arr[i] = rand() % 10;
	}
	for (int i = 0; i < SIZE; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	printf("SelectSort() :");
	SelectSort(arr, SIZE);
	for (int i = 0; i < SIZE; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n\n");
	return 0;
}

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

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

相关文章

vue+leaflet实现聚合图(根据半径划分)

效果 官方示例 github地址 1. 安装leaflet.markercluster插件 npm install leaflet.markercluster -S** 2. 在项目中引入leaflet.markercluster和样式文件 ** import leaflet.markercluster/dist/MarkerCluster.css import leaflet.markercluster/dist/MarkerCluster.Def…

SqlServer定时执行存储过程

1.连接数据库后选择【SQL Server 代理】—【作业】——右键【新建作业】&#xff0c;具体操作如下图&#xff1a; 2.【新建作业】步骤如下图所示&#xff1a; 3.新建【步骤】&#xff0c;具体如下图所示&#xff1a; 4.新建【计划】&#xff0c;具体如下图所示&#xff1a; 6.配…

Ubuntu 20.04 下g++用不了,但是提示已经安装

问题描述 用sudo apt-get install g来安装&#xff0c;系统却又说g已经是最新版本了&#xff0c;但是用g -v查看又提示需要安装 g&#xff0c;如图片所示。 解决方法 未安装g&#xff0c;安装依赖只需运行命令行&#xff1a; sudo apt-get install build-essential仍然无法成…

docker部署redis

一、拉取镜像 docker search redis 我部署的是redis6.0&#xff0c;使用docker pull 拉取镜像 docker pull redis:6.0 拉取成功后使用docker image查看镜像 docker images | grep redis 二、创建挂载目录 在 /opt 目录下创建redis的 conf 和 data 目录 sudo mkdir /opt/re…

YOLOv5 环境安装

Windows11下yolov5环境配置系列教程&#xff08;基础部分&#xff09; Windows11下yolov5环境配置系列教程&#xff08;基础部分&#xff09;_wnowswolf的博客-CSDN博客 安装 Anaconda3 可以改为miniconda 占用更小 将安装目录下的Scripts和condabin文件夹的路径加入环境变…

linux重启网卡失败

[TO简单粗暴啊&#xff1a; RTNETLINK answers: File exists 这个报错&#xff0c;我看了一下网卡目录下出现了两个网卡配置文件&#xff0c;一个ens33&#xff0c;一个eth0。我本机是ens33&#xff0c;所以把eth0的删除了&#xff0c;就可以了。我这个是测试机器&#xff0c;…

人脸识别是什么?及人脸识别的流程

目录 1. 人脸识别是什么及应用场景2. 人脸识别的组成2.1 前端图像采集2.2 后端智能平台 3.人脸技术的流程3.1人脸检测3.2人脸对齐3.2.1仿射变换3.2.2对齐方法 3.3人脸编码&#xff08;提取特征向量&#xff09;3.4人脸分类 1. 人脸识别是什么及应用场景 人脸识别特指利用分析比…

什么是 frp内网穿透?快解析内网穿透如何实现远程办公?

1.什么是frp内网穿透 frp是一个开源、简洁易用、高性能的内网穿透和 反向代理软件&#xff0c;支持 tcp, udp, http, https等协议&#xff0c;虽然它体积轻量但功能很强大。它利用处于内网或防火墙后的机器&#xff0c;对外网环境提供 http 或 https 服务&#xff1b;对于 htt…

python项目在linux中的启动脚本(shell脚本)

背景&#xff1a; 在linux环境&#xff0c;使用shell脚本&#xff0c;实现对某个服务的启动、停止功能。 shell脚本的功能&#xff1a; 启动&#xff08;start&#xff09;&#xff1a;通过参数 start &#xff0c;实现启动服务。如果该服务已经启动&#xff0c;给出已经启动…

2023年江西省研究生数模竞赛国际“合作-冲突”的演化规律研究

2023年江西省研究生数模竞赛 国际“合作-冲突”的演化规律研究 原题再现 国家之间的“合作-冲突”行为具有复杂性和多变性&#xff0c;对其决策模式的研究有着重要的意义。例如&#xff0c;对国际冲突和危机的准确预测可以帮助决策者采取有效的措施来防止或缓解冲突&#xff…

都是全志T113处理器,“-i”和“-S3”有什么区别?

自9个月前&#xff0c;创龙科技“1片含税就79元”的全志T113-i双核ARM Cortex-A71.2GHz的工业核心板(SOM-TLT113)推出之后&#xff0c;不少嵌入式软硬件工程师、用户都咨询我们&#xff0c;究竟T113-i和T113-S3这两款处理器有什么区别&#xff1f;不同后缀型号的处理器&#xf…

嵌入式芯片启动过程全解析,彻底理解bootloader

当你按下电源开关的那一瞬间&#xff0c;第一行代码&#xff0c;是如何在芯片上运行起来的呢&#xff1f; 我们都知道嵌入式软件代码&#xff0c;是需要通过一定的方式&#xff0c;烧录在硬件芯片中才能运行&#xff0c;而我们所熟知的烧录方式&#xff0c;除了物理刻蚀以外&a…

数据分析知识图谱

在做数据分析时&#xff0c;经常会有这样的困扰&#xff1a;面对几种相似的方法&#xff0c;既不清楚它们各自的使用场景&#xff0c;也无法分清它们之间的差别&#xff0c;一念之差就可能选错方法。如果你也有这样的困扰&#xff0c;建议按照SPSSAU知识图谱目录顺序检索对应的…

【万字】一文教会你关于“生成对抗网络GAN”的所有知识

1 GAN基本概念 1.1 GAN介绍 GAN的英文全称是Generative Adversarial Network&#xff0c;中文名是生成对抗网络。它由两个部分组成&#xff0c;生成器和鉴别器&#xff08;又称判别器&#xff09;&#xff0c;生成网络&#xff08;Generator&#xff09;负责生成模拟数据&…

深度分析我国“智慧+”养老模式的发展情况

随着我国的老龄化人口结构的不断加深&#xff0c;传统旧的养老服务模式已经无法全面适应当前的养老市场的需求&#xff0c;因此需要寻求更加新型的、多元化的模式来解决老年人的不同层次的需求&#xff0c;“智慧”养老的服务模式从而成为了新养老产业发展的主要导向。 “智慧…

【1089. 复写零】

目录 一、题目解析二、算法原理三、代码实现 一、题目解析 二、算法原理 三、代码实现 class Solution { public:void duplicateZeros(vector<int>& arr){//找出最后一个数int dest-1,cur0;for(;;cur){if(arr[cur]){dest;}else{dest2;}if(dest>arr.size()-1){bre…

GPT-4:AI的新突破,重塑芯片设计领域

随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;其在各个领域的应用也日益广泛。最近&#xff0c;纽约大学Tandon工程学院的研究人员利用OpenAI的GPT-4模型&#xff0c;成功设计出了一个芯片&#xff0c;这标志着AI在硬件设计领域的重大突破。 GPT-4通过简单的英…

华为战略方法论:BLM模型之差距分析(限制版)

目录 说明 差距类型 1、业绩差距 2、机会差距 3、对标差距 专栏列表 个人简介 说明 今天就来谈谈 BLM 模型中的第一把钥匙&#xff0c;也就是差距分析。 从本质上来看。 BLM 模型中的差距与你在日常生活中听到或用到的差距在意义都是一样的。 不同之处就在于问题的复…

数据迁移工具,用这8种!

前言 最近有些小伙伴问我&#xff0c;ETL数据迁移工具该用哪些。 ETL(是Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程)&#xff0c;对于企业应用来说&#xff0c;我们经常会遇到各种数据的处理、转换、迁移的场景。 今天特地给大家汇总了一些目前…

chatgpt赋能python:Python遍历n中所有数字

Python 遍历 n 中所有数字 Python 是一种高级编程语言&#xff0c;它被广泛用于许多应用程序和领域&#xff0c;如机器学习、人工智能和数据可视化等。Python 在处理数字时非常方便&#xff0c;因为它支持大量的数字操作和运算。在这篇文章中&#xff0c;我们将讨论如何使用 P…