希尔排序(含详细代码和手算结果)

这里我只写了第一趟的排序手算结果,后面都跟第一趟差不多的。
在这里插入图片描述

/*
基本思想
{
    插入排序:每次将一个待排序的记录按其关键字大小插入前面已经排好序的子序列,直到全部记录插入完成。(直接插入排序,折半插入排序,希尔排序)
    希尔插入排序步骤:
    {
        基本思想:将待排序的顺序表分割成若干个子表,对各个子表分别进行插入排序,当整个表中的元素“基本有序”时,在对全体记录进行一次直接插入排序
		1.先取一个小于n的步长d1,把表中的全部记录分成d1组,所有距离为d1的倍数的记录放在一组,在各个组内进行插入排序
        2.然后取第二个步长d2<d1,重复上述操作,直到d=1.
    }
    希尔插入排序算法分析:
    {
        空间效率:O(1),仅使用了常数个辅助单元
		最坏情况下时间复杂度为:O(n^2)
		稳定性:不稳定
		适用性:适用于线性表为顺序存储的情况
    }
}
*/
#include<stdio.h>
#include<stdlib.h>
#define size 15
typedef struct 
{
    int data[size];
    int length;
}sqlist;
//随机建表
bool creatlist(sqlist &s) 
{
    int i;
    i=1;
    s.data[0];  //作为暂存单元
    s.length=0;
    while(i<=size-1)
    {
        s.data[i]=rand()%50+12;
        i++;
        s.length++;
    }
    printf("顺序表建立成功!长度为%d\n",s.length);
    return true;
}
//输出顺序表
void pirintlist(sqlist s)
{
    int i;
    for(i=1;i<=s.length;i++)
    {
        printf("%d ",s.data[i]);
    }
}
//希尔插入排序
void ShellSort(sqlist &s,int len) //len=s.length
{
	int i,j,step;
	int f=1;
	for(step=len/2;step>=1;step/=2)//步长间隔每次减半
	{
		for(i=step+1;i<=len;i++)//这里step+1,是因为我是从数字位序1开始存的数据
		{
			if(s.data[i]<s.data[i-step])
			{
				s.data[0]=s.data[i];
				for(j=i-step;s.data[j]>s.data[0]&&j>0;j=j-step)
				{
					s.data[j+step]=s.data[j];
				}
				s.data[j+step]=s.data[0];
			}
		}
		printf("\n长度为%d\n第%d趟排序结果为:\n",step,f++);
		pirintlist(s);
	}
}
int main()
{
    sqlist s;
    creatlist(s);
    pirintlist(s);
	ShellSort(s,s.length);
	printf("\n排序后顺序表内容为:\n");
    pirintlist(s);
	return 0;
}

实验结果图
在这里插入图片描述
代码如有错误或者需要改正的地方,欢迎大佬进行改正!

假设我们有一张大小为3x3的灰度图像如下: | 50 | 100 | 150 | |----|-----|-----| | 75 | 125 | 175 | | 100| 150 | 200 | 首先,我们需要把这张图像进行中值滤波。中值滤波是一种常用的平滑图像的方法,它的基本思想是用窗口中像素的中值来代替中心像素的灰度值。在这个例子中,我们可以选择一个3x3的窗口,将窗口内的9个像素按照灰度值从小到大排序,然后取中间的那个值作为中心像素的新灰度值。对于边界上的像素,我们可以选择直接复制边界像素的灰度值。因此,对于这张图像,进行中值滤波后的结果如下: | 50 | 75 | 100 | |----|----|-----| | 75 | 125| 150 | | 100| 150| 175 | 接下来,我们要用Sobel算子对中值滤波后的图像进行增强。Sobel算子是一种常用的边缘检测算法,它的基本思想是对图像中每个像素点进行卷积操作,通过比较像素点周围的灰度值来判断该像素点是否为边缘点。Sobel算子包括水平方向和垂直方向两个卷积核,它们分别是: 水平方向卷积核: |-1|0|1| |:-:|:-:|:-:| |-2|0|2| |-1|0|1| 垂直方向卷积核: |-1|-2|-1| |:-:|:-:|:-:| |0|0|0| |1|2|1| 对于每个像素点,我们分别用水平方向和垂直方向的卷积核对其进行卷积操作,然后取两个卷积结果的平方和的开方作为该像素点的新灰度值。对于边界上的像素,我们可以选择直接复制边界像素的灰度值。因此,对于这张图像,经过Sobel算子增强后的结果如下: | 198 | 256 | 198 | |-----|-----|-----| | 292 | 0 | 292 | | 198 | 256 | 198 | 其中,像素点(2,2)的灰度值为0,是因为它处于图像的中心位置,它的周围像素的灰度值都比它大或小,因此它不是边缘点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值