插入排序和希维尔排序算法的实现

直接插入排序:
当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移如下图所示
在这里插入图片描述
当我们开始写插入排序时,可能感觉看懂了思想,但是写代码时却有种无从下手的感觉,这时我们不妨将插入排序进行分解首先我们先看成一个数据插入如下代码所示
如当前[0,end]区间内的数据有序时将end+1个数据插入[0,end]的区间内

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

a[end+1]=temp;

在看简单的将end看成一个序列插入1 2 3 …个数就是如下程序

for(int i=0;i<n-1;i--)//这里n代表排序数组的个数 i<n-1的原因是由于n个数只需要排序n-1次就可以成为有序数组
{
	int end=i;
	int temp=a[end+1];
while(end>=0)
{
	if(temp<a[end])
	{
		a[end+1]=a[end];
		end--;
	}
	else
	{
		break;
	}
}

a[end+1]=temp;
}

希尔排序可以分成两步 :
1、预排序 是为了接近有序。
2、直接插入排序

预排序其实就是间距为gap的直接插入排序(gap为1)之后就是在进行直接插入排序如下图所示
在这里插入图片描述

void ShellSort(int* a, int n)
{
	int gap = n;
	int i = 0;
	while (gap >1)
	{
		gap = gap / 3 + 1;
		for (i = 0; i < n - gap; i++)
		{
			int end = i;
			int temp = a[end + gap];
			while (end >= 0)
			{
				if (temp < a[end])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}

			a[end + gap] = temp;
		}

	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值