深入浅出从插入排序到希尔排序

文章介绍了插入排序的概念,通过打扑克的比喻帮助理解,详细阐述了插入排序的实现过程及时间复杂度。接着,文章讨论了希尔排序,它是插入排序的改进版,通过预排序策略提高效率。希尔排序的时间复杂度分析表明其优于插入排序。全文旨在帮助编程初学者理解这两种排序算法及其优化。
摘要由CSDN通过智能技术生成

作者介绍:一名正在学习编程技术的萌新,希望和大家一起进步。上传的内容,都是我学习过程中的笔记。
个人主页:个人主页
数据结构专栏:数据结构

什么是插入排序

在这里插入图片描述

插入排序可以理解为打扑克摸牌的过程,从3到大小王,当你摸了一张梅花10,就从大小王开始比直到遇到九就插入在9的后面,这就是插入排序!

插入排序的实现

单躺插入排序

单躺的插入排序过程(均以升序为例)

一直比较tmp和a[end]直到找到第一个比tmp小的为止,或者end走到-1了也就是tmp是最小的

	while (end >= 0)//一直比较tmp和a[end]直到找到第一个比tmp小的为止,或者end走到-1了也就是tmp是最小的
	{   
		int tmp=[end+1]if (a[end] > tmp)
		{
			a[end+1] = a[end];
			end--;
		}
		else
		{
			break;
		}
	}
	a[end + 1] = tmp;//这种写法非常巧妙把end=-1和正常情况合二为一了

完整的插入排序

也就多了一个end和tmp的赋值,相当于最开始排两个然后,后面依次加一个

void InsertSort(int *a,int se)
{
	int tmp, end;
	for (int i = 1; i < se; i++)
	{
		end = i - 1;
		tmp = a[i];
		while (end >= 0)
		{
			if (a[end] > tmp)
			{
				a[end+1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

插入排序的时间效率

最坏的情况下是每次都要挪动也就是逆排序,1+2+3+…n
为(n*n)级,但是它比冒泡排序好,因为冒泡每次都是无脑比较,固定1+2+3…n;

插入排序到希尔排序

希尔排序是插入排序的升级
1.先预排序
2.再插入排序

在这里插入图片描述

预排序的实现

单躺的一组gap的预排序

和插入排序很像,当gap=1时就是单躺的插入排序了

	while (end >= 0)
	{
		int tmp=a[end+gap];
		if (tmp < a[end])
		{
			a[end+gap] = a[end];
			end -= gap;
		}
		else
		{
			break;
		}
	}
	a[end + gap] = tmp;

所有组gap的预排序法一(一组一组的排)

一组一组的排,排完红色排蓝色排完蓝色排绿色
在这里插入图片描述

for (int j = 0; j < gap; j++)
{
	for (int i = j; i < n - gap; i += gap)
	{//一组一组的排
		end = i;
		tmp = a[end + gap];
		while (end >= 0)
		{
			if (tmp < a[end])
		{
			a[end+gap] = a[end];
			end -= gap;
		}
			else
		{
			break;
		}
	}
	a[end + gap] = tmp;
}

所有组的预排序法二(多组并排)

for (int i = 0; i < n - gap; i++)
{
	end = i;
	tmp = a[end + gap];
	while (end >= 0)
	{
		if (a[end] > tmp)
		{
			a[end + gap] = a[end];//往前挪动
			end -= gap;
		}
		else
		{
			break;
		}
	}
			a[end + gap] = tmp;
		}
	}
}

希尔排序的完整过程

就是多了个gap 当gap==1时就是插入排序了

gap=gap/3+1 gap永远都可以为一!
在这里插入图片描述

void ShellSort2(int *a,int n)
{
	int end, tmp;
	int gap = n;
	while (gap > 1){
		gap = gap / 3 + 1;
		for (int i = 0; i < n - gap; i++){
			end = i;
			tmp = a[end + gap];
			while (end >= 0){
				if (a[end] > tmp){
					a[end + gap] = a[end];//往前挪动
					end -= gap;
				}
				else{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}

希尔排序的时间效率

while循环了logN次因为gap = gap / 3 + 1;每次都除以3;所以log级,预排序的每次的次数*是n级,总的时间效率简单的分析为nlogn!

在这里插入图片描述


在这里插入图片描述

可以看出希尔排序还是比较优秀的排序

谢谢观看

如果对你有帮助,那就真的太荣幸了!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值