C语言--直接插入排序【排序算法|图文详解】


一.直接插入排序介绍🍗

直接插入排序又叫简单插入排序,是一种简单直观的排序算法,它通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。

算法描述:

  1. 假设要排序的列表为arr,列表的第一个元素arr[0]默认已经是有序序列。
  2. 从第二个元素开始,即arr[1],向前遍历已排序的部分,将该元素插入到正确的位置。
  3. 在遍历已排序部分时,如果当前元素小于前一个元素,将当前元素与前一个元素交换位置,否则停止遍历。
  4. 重复步骤2和步骤3,直到所有元素都被插入到正确的位置。

由于在每次插入过程中,需要不断比较和移动元素,最坏情况下时间复杂度为O(n^2) ,其中n是要排序的元素个数。然而,若输入数据已经近乎有序,直接插入排序的效率会比较高,时间复杂度可接近O(n)。若完全有序,时间复杂度为O(n).

直接插入排序的特点:

不需要额外的空间

过程稳定

适用于数据规模较小且部分有序的情况


二.图解过程🍗


以下以数组6,3,4,5,7,1为例。从小到大排序
核心:取出无序部分的首个,在有序部分从后向前比较,插入到合适的位置

1. 首先看第一个数字:6,把数组分为有序部分和无序部分。

2.把无序部分的第一个元素3,插入到有序部分的合适位置

3.重复2中的操作部分,直到所有元素都有序。

需要注意的是有时候需要多次比较,比如数字1,需要多次比较,一次插入。

最后重复以上步骤,直至完全有序。


三.代码分析🍗

  • 由于第一个数字是有序的,因此n个数字只需要遍历n-1次,i的初始值设为1

  • 由于每次插入时都是从前一个数字开始比较,我们可以设置j的初始值为i-1

  • 完整代码

cpp 复制代码
//直接插入排序(简单插入排序或者直接插入排序)
//第一个数字必然有序,所以从第二个数字开始的。
//从第二个数字开始, 从后往前找比当前数字小的, 找到后插入到这个小的数字的后面; 
//在找的过程中, 如果发现一个比当前数字大, 同时将这个数字往后挪.
#include <stdio.h>
void  InsertSort(int* arr, int len)//insert 插入
{
	int tmp;
	int j;
	for (int i = 1; i < len; i++)//i为当前需要处理的数字的下标,i从第二个数字下标1开始
	{
		tmp = arr[i];
		for (j = i - 1; j >= 0; j--)//从后往前找位置,同时移动数据
		{
			if (arr[j] > tmp)
			{
				arr[j + 1] = arr[j];
			}
			else
			{
				//arr[j + 1] = tmp;
				break;
			}
		}
		arr[j + 1] = tmp;
	}
}
void  Show(int* arr, int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%d  ", arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[] = { 6,3,4,5,7,1};
	InsertSort(arr, sizeof(arr) / sizeof(arr[0]));
	Show(arr, sizeof(arr) / sizeof(arr[0]));
	return 0;
}

运行结果


四.效率分析🍗

时间复杂度:
最坏情况下:时间复杂度为O(n^2)
完全有序情况下:时间复杂度为O(n)
空间复杂度:O(1)


创作不易,如果喜欢的话,请给博主一个免费的赞以表支持吧.🍗

相关推荐
特立独行的猫a14 小时前
C 语言各种指针详解
java·c语言·开发语言
彭于晏Yan15 小时前
MyBatis-Plus使用动态表名分表查询
java·开发语言·mybatis
迎風吹頭髮19 小时前
UNIX下C语言编程与实践9-UNIX 动态库创建实战:gcc 参数 -fpic、-shared 的作用与动态库生成步骤
c语言·数据库·unix
MediaTea20 小时前
Python IDE:Spyder
开发语言·ide·python
不枯石21 小时前
Matlab通过GUI实现点云的均值滤波(附最简版)
开发语言·图像处理·算法·计算机视觉·matlab·均值算法
不枯石21 小时前
Matlab通过GUI实现点云的双边(Bilateral)滤波(附最简版)
开发语言·图像处理·算法·计算机视觉·matlab
二十雨辰1 天前
vite如何处理项目中的资源
开发语言·javascript
聆风吟º1 天前
远程录制新体验:Bililive-go与cpolar的无缝协作
开发语言·后端·golang
想唱rap1 天前
直接选择排序、堆排序、冒泡排序
c语言·数据结构·笔记·算法·新浪微博
豆浆whisky1 天前
netpoll性能调优:Go网络编程的隐藏利器|Go语言进阶(8)
开发语言·网络·后端·golang·go