栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

插入排序和希尔排序(C++实现)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

插入排序和希尔排序(C++实现)

一、插入排序

  1. 插入排序由N-1趟排序组成(第一个元素不需要执行插入操作),插入排序利用这样一个事实:对于第p趟,位置0到位置p-1上的元素为已排好序的状态。所以在第p趟,只需让位置p上的元素向左逐个比较找到合适插入的位置。
  2. 代码实现
template 
void InsertionSort(vector& a)
{
	for (int p = 1; p < a.size(); ++p)
	{
		int tmp = move(a[p]);//将待插入元素移交给哨兵

		int j;
		//从后往前查找待插入的位置
		for (j = p; j > 0 && tmp < a[j - 1]; --j)
		{
			a[j] = move(a[j - 1]);
		}

		//移动待插入元素到插入位置
		a[j] = move(tmp);
	}
}

代码中内层for循环意思是:判断第p趟时a[p]是否小于a[p-1],如果是,则a[p-1]向后(右)移动一个位置。

注意:for循环中条件不满足时,会跳出不执行循环体和--j.(之前本人对for循环原理模糊导致无法理解插入排序代码原理,特此标注)。

二、希尔排序(C++实现)

1.代码如下:

template 
void ShellSort(vector& a)
{
	for (int gap = a.size()/2; gap>0; gap/=2)
	{
		for (int p = gap; p < a.size(); ++p)
		{
			int tmp = move(a[p]);//将待插入元素移交给哨兵

			int j;
			//从后往前查找待插入的位置
			for (j = p; j > gap-1 && tmp < a[j - gap]; j-=gap)
			{
				a[j] = move(a[j - gap]);
			}
			//移动待插入元素到插入位置

			a[j] = move(tmp);
		}
	}
}

希尔排序需要定义一个增量,这里选择增量为gap=序列长度/2,缩小增量以gap=gap/2的方式 。

2.记忆技巧

对比插入排序:在插入排序外套了一层for循环,用的是希尔推荐的希尔增量。再将原来插入排序代码中所有的1换成gap,而0自然就换成gap-1.例如上述代码中j--就换成j-=gap.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/836126.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号