排序(二)

排序算法(二)(插入排序与希尔排序)

三. 插入排序(Insertion Sort)

基本思想:
在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
在这里插入图片描述
好比玩扑克牌抽牌时先先抽一张,再抽第二张这俩张牌按顺序放,再抽第三张在前俩张排好顺序的情况下再按顺序插入进去保证这三张牌是按顺序依次类推。
在这里插入图片描述

C语言代码实现:

#include<stdio.h>
#include<string.h>

int main()
{
	int a[100];//输入的无序数组
	int n;//数组个数
	scanf("%d", &n);//输入数组个数
	int i;//循环变量
	int j;//循环变量
	int temp=0;
	memset(a, 0, n * sizeof(int));//数组初始化为0
	for (i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);//数组赋值
	}

	for (i = 0; i < n-1; i++)//一张一张抽牌
	{
		for (j = i + 1; j > 0; j--)//从当前手上的有序牌进行插入一张牌使所有牌都是有序的
		{
			if (a[j] < a[j - 1])//交换
			{
				temp = a[j];
				a[j] = a[j - 1];
				a[j - 1] = temp;
			}
		}
	}
	for (i = 0; i < n; i++)
	{
		printf(" %d", a[i]);
	}
	return 0;
}

运行结果
在这里插入图片描述

四. 希尔排序(Shell Sort)

基本思想:
在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。
然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。
** 过程**
在这里插入图片描述C语言代码:

#include<stdio.h>
#include<string.h>

int main()
{
	int a[100];//输入的无序数组
	int n;//数组个数
	scanf("%d", &n);//输入数组个数
	int i;//循环变量
	int j;//循环变量
	int k;//循环变量
	int incre=n;//用来分段
	int temp = 0;

	memset(a, 0, n * sizeof(int));//数组初始化为0
	for (i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);//数组赋值
	}

	while (incre!=1)//当分不了段时 结束循环
	{
		incre = incre / 2;//每进行一次循环 分段数将会减半(每次循环都会将相邻的俩段合并为一段)
		for (k = 0; k < n; k = k + incre)//分成incre个段。每一次循环相当于对每一个段进行操作
		//相当于把一整个数分为奇数与偶数之类的让后分别对奇数组与偶数组进行曹祖
		//只不过希尔排序先进行了一次俩俩分组让后将组数依次合并
		{
			for (i = k + incre; i < n; i = i + incre)//插入排序
			//这里i=k+incre而不是i=k起始条件说明的就是对不同的段进行操作 决定操作哪个段的是k
			//0 2 4 6 8是一个段而0+1 2+1 4+1 6+1 8+1即 1 3 5 7 9也是一个段
			//i=i+incre表示这次循环操作是在这个段里的上述例子就是i=i+2使得操作再偶数组或者奇数组里操作
			{
				for (j = i; j > k; j = j - incre)//同理进行前几项有序拆入一个无须数的插入.
				{
					if (a[j] < a[j - incre])//交换
					{
						temp = a[j];
						a[j] = a[j - incre];
						a[j - incre] = temp;
					}
					else break;
				}

			}
		}

	}

	for (i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}


	return 0;
}代码片

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wy-1226

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值