希尔排序算法核心思想:
1.以一个步长d将一个数组分成d个组(仍然是一个数组,比如 1 2 3 4 5 6,假设d=2,则分1 3;2 4;3 6三组,但是数组内容不变,只是逻辑上分为3组)。
2.分别对每个小组进行插入排序。
3.d缩小一倍,重复步棸1.
以下示意图摘自原博客:https://blog.csdn.net/weixin_37818081/article/details/79202115
代码附上:
#include <stdio.h>
void shsort(int s[], int n) /* 自定义函数 shsort()*/
{
int i, j, d,tmp;
d = n / 2; /*确定固定增虽值*/
while (d >= 1)
{
for (i = d ; i < n; i++) /*数组下标从d+1开始进行直接插入排序*/
{
tmp = s[i]; /*设置监视哨*/
j = i - d; /*确定要进行比较的元素的最右边位置*/
while ((j>=0) && (tmp<s[j]))
{
s[j + d] = s[j]; /*数据右移*/
j = j - d; /*向左移d个位置V*/
}
s[j + d] = tmp; /*在确定的位罝插入s[i]*/
}
d = d / 2; /*增里变为原来的一半*/
}
}
void main()
{
int b[] = { 25,24,30,29,50,27,26,290,24,20 };
shsort(b, 10);
for (int i = 0; i < 10; i++)
printf("%d ", b[i]);
while (1);
}