插入排序与希尔排序

个人主页:Lei宝啊

愿所有美好如期而遇


前言:

这两个排序在思路上有些相似,所以有人觉得插入排序和希尔排序差别不大,事实上,他们之间的差别不小,插入排序只是希尔排序的最后一步。


目录

前言:

插入排序:

思路:

图解:

代码:

希尔排序:

思路:

图解:

代码:


插入排序:

思路:

当我们有了一个有序的数组arr,假设为升序,现在向里面插入一个新数据。

我们假设这个数组有n个元素,最后一个元素的下标我们记作end,那么要插入的这个数下标为end+1,并用tmp记下这个数的大小。

接下来,如果tmp小于arr[end],那么arr[end+1] = arr[end]; end--,

如果tmp大于等于arr[end],那么break; arr[end+1] = tmp;

重复上述操作,直到end < 0或者break跳出


那么面对一个无序的数组,我们可以将第一个元素当做有序,第二个元素为新插入元素,依次类推排序

图解:

代码:

复制代码
void InsertSort(int* arr, int n)
{
	
	//i == n - 2时,temp = arr[n - 1];
	for (int i = 0; i < n - 1; i++)
	{
		int end = i;
		int temp = arr[end + 1];

		//此处画个图,end小于0跳出循环
		while (end >= 0)
		{
			if (temp < arr[end])
			{
				//插入的值比end小,end值向后移动一位
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
				break;
			}

		}
		//写在循环外的原因是如果while循环不是break出来的
		//会导致第一个元素值重复,插入的值最后未插入进去
		arr[end + 1] = temp;
	}
	
}

希尔排序:

思路:

希尔排序比插入排序多的就是预排序,而预排序的目的就是让大的数据/小的数据更快的被排到后面去,因为越接近有序的数据,使用插入排序时时间复杂度越接近O(N),而我们的希尔排序最后一步等同于插入排序

图解:

以代码一为例:

代码:

两个代码没有什么差别,只是一个是一组一组排,一个是并排。

代码一:
复制代码
void ShellSort(int* arr, int n)
{

	int gap = n;

	while (gap > 1)
	{

		//多组预排序,最后接近有序时插入排序
		gap /= 2;

		//完成一趟预排序
		for (int j = 0; j < gap; j++)
		{
			//完成一组预排序
			for (int i = j; i < n - gap; i += gap)
			{
				//走一组中的一个位置的预排序
				int end = i;
				int temp = arr[end + gap];

				while (end >= 0)
				{
					if (temp < arr[end])
					{
						arr[end + gap] = arr[end];
						end -= gap;
					}
					else
					{
						break;
					}
				}

				arr[end + gap] = temp;
			}

		}
	}
	
}
代码二:
复制代码
void ShellSort(int* arr, int n)
{
	int gap = n;

	while (gap > 1)
	{

		//多组预排序,最后接近有序时插入排序
		gap /= 2;
		
		//等同于上面的希尔排序,不是分组排了,而是并排
		for (int i = 0; i < n - gap; i++)
		{
			//走一组中的一个位置的预排序
			int end = i;
			int temp = arr[end + gap];

			while (end >= 0)
			{
				if (temp < arr[end])
				{
					arr[end + gap] = arr[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}

			arr[end + gap] = temp;
		}	
	}
}

相关推荐
快去睡觉~34 分钟前
力扣73:矩阵置零
算法·leetcode·矩阵
小欣加油1 小时前
leetcode 3 无重复字符的最长子串
c++·算法·leetcode
月盈缺4 小时前
学习嵌入式的第二十二天——数据结构——双向链表
数据结构·学习·链表
猿究院--王升4 小时前
jvm三色标记
java·jvm·算法
一车小面包4 小时前
逻辑回归 从0到1
算法·机器学习·逻辑回归
科大饭桶5 小时前
C++入门自学Day14-- Stack和Queue的自实现(适配器)
c语言·开发语言·数据结构·c++·容器
tt5555555555555 小时前
字符串与算法题详解:最长回文子串、IP 地址转换、字符串排序、蛇形矩阵与字符串加密
c++·算法·矩阵
元亓亓亓6 小时前
LeetCode热题100--101. 对称二叉树--简单
算法·leetcode·职场和发展
躲在云朵里`6 小时前
深入理解数据结构:从数组、链表到B树家族
数据结构·b树
不会学习?7 小时前
算法03 归并分治
算法