希尔排序,必须会直接插入排序
直接插入排序 :https://blog.csdn.net/dudadudadd/article/details/112571578
#include "stdio.h"
#define MAX 100
struct slist
{
float a[MAX];
int len;
};
// 传 结构体指针 不要返回值
void fun(struct slist *s)
{
int i,j;
float t;
int k;
for(k=s->len/2;k>=1;k=k/2)
{
for(i=k;i<s->len;i++)
{
t=s->a[i];
for(j=i-k;j>=0&&t<s->a[j];j=j-k) //j 代表有序区下标
{
s->a[j+k]=s->a[j];//有序区元素后移
}
//空余的地方
s->a[j+k]=t;
}
}
//输出
for(i=0;i<s->len;i++)
{
printf("%.2f\t",s->a[i]);
}
}
void main()
{
int i;
struct slist s;
s.len=0;
for(i=0;i<10;i++)
{
printf("请输入第%d个元素:",s.len+1);
scanf("%f",&s.a[s.len]);
s.len++;
}
fun(&s);
}
希尔排序只是将直接插入排序写的更高大上了而已,大家自己用一串数据推导一下,就会发现两种算法其实本质上就是一种算法,只不过将原本直接插入排序一次就能搞定的东西,拆分成了k=s->len/2;k>=1;k=k/2次而已,使得一趟比较少比较一些,导致了比较的趟数多了