插入排序+希尔排序

目录

插入排序:

希尔排序:


插入排序:

注意这里不要将插入排序和冒泡排序弄混:

插入排序是将数据不断放入前一个有序数列:

cpp 复制代码
// 插入排序
void InsertSort(int* a, int n)
{
	for (int j =1; j < n; j++)
	{
		for (int i = j; i > 0; i--)
		{
			if (a[i] < a[i - 1])
			{
				int m = a[i - 1];
				a[i -1] = a[i];
				a[i] = m;
			}
			else
			{
				break;
			}
		}
	}	
}

希尔排序:

将插入排序进行多次实现,从高间距到低间距,最后到间距为1的插入排序:

如图我们将具有相同标记的方格记为一组,并分别对不同组进行插入排序,这样就会将序列变得比原来有序,这样不断进行,并不断缩小排序的间距。

这样再次进行排序将会变的更加有序,直到间距为1。间距为1时进行排序将变为插入排序,序列将完全有序。

target为间距

cpp 复制代码
// 希尔排序
void ShellSort(int* a, int n)
{
	int target=n/2;
	while (target)
	{

		for (int m = 0; m < target; m++)//实现多组排序
		{
			
			for (int j = m; j < n ; j += target)//单组排序
			{
				for (int i = j; i > target-1; i -= target)//这里不能是i>0,i-target最小为0
				{
					if (a[i] < a[i - target])
					{
						int m = a[i - target];
						a[i - target] = a[i];
						a[i] = m;
					}
					else
					{
						break;
					}
				}
			}
		}

		target /= 2;
	}	
}

当然这里我们进行三层循环有一些繁琐,这里我们可以改善成为两层循环:

也就是第一组进行一次插入排序,第二组进行一次插排序........不断前进

cpp 复制代码
// 希尔排序
void _ShellSort(int* a, int n)
{
	int target = n / 2;
	while (target)
	{

			for (int j = 0; j < n; j ++)//递进形式排序
			{
				for (int i = j; i > target - 1; i -= target)//这里不能是i>0,i-target最小为0
				{
					if (a[i] < a[i - target])
					{
						int m = a[i - target];
						a[i - target] = a[i];
						a[i] = m;
					}
					else
					{
						break;
					}
				}
			}
		target /= 2;
	}
}
相关推荐
浅念同学7 分钟前
算法.图论-并查集上
java·算法·图论
何不遗憾呢15 分钟前
每日刷题(算法)
算法
立志成为coding大牛的菜鸟.20 分钟前
力扣1143-最长公共子序列(Java详细题解)
java·算法·leetcode
鱼跃鹰飞20 分钟前
Leetcode面试经典150题-130.被围绕的区域
java·算法·leetcode·面试·职场和发展·深度优先
liangbm326 分钟前
数学建模笔记——动态规划
笔记·python·算法·数学建模·动态规划·背包问题·优化问题
潮汐退涨月冷风霜31 分钟前
机器学习之非监督学习(四)K-means 聚类算法
学习·算法·机器学习
B站计算机毕业设计超人37 分钟前
计算机毕业设计Python+Flask微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分析系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI
爬虫·python·深度学习·算法·机器学习·自然语言处理·数据可视化
羊小猪~~41 分钟前
深度学习基础案例5--VGG16人脸识别(体验学习的痛苦与乐趣)
人工智能·python·深度学习·学习·算法·机器学习·cnn
ahauedu42 分钟前
案例分析-Stream List 中取出值最大的前 5 个和最小的 5 个值
数据结构·list
X同学的开始3 小时前
数据结构之二叉树遍历
数据结构