【数据结构】排序1 直接插入排序

在这里插入图片描述

常见的排序算法有以上八种,所以预估会分成几期来讲,感兴趣的朋友们不妨点个收藏专栏。 ღ( ´・ᴗ・` )比心


插入排序

基本思想

直接插入排序是一种简单的插入排序方法,把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

可以类比我们玩扑克牌的时候。

在这里插入图片描述

动图演示

先来看个动图

请添加图片描述

图解排序

先看一趟排序,有这样一个数组

在这里插入图片描述

此时end指向下标是0的位置,x是end后一个元素。

排升序,a[end] > x, a[end+1] = a[end]

在这里插入图片描述

end–;

end到了-1位置,a[end+1] = x;

在这里插入图片描述

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

此时 a[end] < x; break

在这里插入图片描述

同样的,就有下面这样第三趟

在这里插入图片描述

所以,当end==-1或者a[end] < x时,把end+1的位置用x填上即可。

代码

// 插入排序
void InsertSort(int* a, int n)
{
    
    
	for (int i = 0; i < n - 1; i++)
	{
    
    
		// 把x插入到[0, end]区间
		int end = i;
		int x = a[end + 1];
		while (end >= 0)   // 注意end>=0
		{
    
    
			// end == -1, break
			if (a[end] > x)
			{
    
    
				a[end + 1] = a[end];
				--end;
			}
			else
			{
    
    
				// a[end] <= x
				break;
			}
		}
		a[end + 1] = x;
	}
}

复杂度分析

时间复杂度: O(N^2)
最优情况下: O(N)
空间复杂度:O(1)

Guess you like

Origin blog.csdn.net/Joy_Cheung666/article/details/121376132