关于希尔排序的另外一种代码理解方法(C语言)

前言

最近在准备找工作就又重新学了一下数据结构和算法这一门,感觉有些内容理解起来还是有一定难度,希尔算法理论理解起来不难,就是自己独立写有些困难(纯纯渣渣一枚,大佬勿喷哈哈哈哈

前继准备

需要理解透彻直接插入排序,能自己写出来。
代码理解
简单的描述一下希尔排序的理论:
假设一组数字,有n=10个数字,乱序。设置增量gap<n(增量这里先这样定,更严谨的可以查找其他大佬的博客),比如gap=3,那么就是从10个数字中取间隔为3的数字来进行直接插入排序。例如{0 1 2 3 4 5 6 7 8 9}中取间隔为3,{0 3 6 9}来排序,就这样。
****
图片来源
如图中第一段就是先70 10 90 60进行排序,然后在往下一组:30 80 100 45排序,然后再继续。

所以可以先写一个gap的直接插入排序:

	gap = 3;//当取gap=1时候就是直接插入排序了
	for(i=0;i<n-1;i+=gap)//当i=0时候,取的数组就是角标为0,3,6,9的数据
	{
		if(key[i]>key[i+gap])
		{
			num = key[i+gap];
			j = i;
			while(num<key[j])
			{
				key[j+gap] = key[j];
				j-=gap;
			}
			key[j+gap] = num;
		}
	}

就这样,先写出一个直接插入排序的程序,然后再改gap就可以取有增量的插入排序了。
然后呢,按照书上的取增量(10个数的一组数据的话书上讲取增量为5,3,1)三个增量进行三个大循环,如下图,就可完成希尔排序。可以单步调试看效果哦

#include<stdio.h>
#include<stdlib.h>
#define n 10

void dispaly(int *k)
{
	int i;
	for(i=0;i<n;i++)
	{
	printf("%d ",k[i]);
	}
}
int main(void)
{
	int i,j,key[n]={7,2,5,8,9,4,1,0,3,6};
	int num,h,gap,jum[]={5,3,1};

	printf("原有:");
	dispaly(key);

for(h=0;h<3;h++){
	gap = jum[h];
	for(i=0;i<n-1;i+=gap)
	{
		if(key[i]>key[i+gap])
		{
			num = key[i+gap];
			j = i;
			while(num<key[j])
			{
				key[j+gap] = key[j];
				j-=gap;
			}
			key[j+gap] = num;
		}
	}
   
}
    printf("\n排序:");
	dispaly(key);
	return 0;
	
 } 

单步调试时候我看了效果是符合希尔排序的思想的,看到一半就没看了,不知道后边是不是呢哈哈哈,但是直接执行的话排序结果是对的哈哈哈哈哈
关闭IDE
打开bilibili
晚安

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Mr.los

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值