前言
最近在准备找工作就又重新学了一下数据结构和算法这一门,感觉有些内容理解起来还是有一定难度,希尔算法理论理解起来不难,就是自己独立写有些困难(纯纯渣渣一枚,大佬勿喷哈哈哈哈)
前继准备
需要理解透彻直接插入排序,能自己写出来。
代码理解
简单的描述一下希尔排序的理论:
假设一组数字,有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
晚安