一、简介
希尔排序也是一直插入排序。直接插入排序类似于扑克牌的插牌顺序,而希尔排序是通过下标间距相同的数进行分组排序,直至整体有序排序完毕。
二、排序步骤
原始数组:
a[8]={5,3,8,2,4,1,7,6}; length=8
第一趟 默认间距gap = 4 (length/2)
分为四组:
一. 5 4
二. 3 1
三. 8 7
四. 2 6
结果为 : 4 1 7 2 5 3 8 6
第二趟 gap = 2 (4/2)
分为两组:
一. 4 7 5 8
二. 1 2 3 6
结果为:4 1 5 2 7 3 8 6
第三趟 gap=1 (2/2)
分为一组:
一.4 1 5 2 7 3 8 6
结果为: 1 2 3 4 5 6 7 8
排序结果
三、核心算法
增量
int gap=length/2;//增量初值,也是第一个元素间隔为k的下标
交换错误位置的数
int j=i;
while(j>=gap&&t<a[j-gap]){//交换错误位置的数
a[j]=a[j-gap];
j=j-gap;
}
a[j]=t;
gap/=2;
四、源码
#include <stdio.h>
void shellSort(int *a,int length){
int gap=length/2;//增量初值,也是第一个元素间隔为k的下标
while(gap>0){
for(int i=gap;i<length;i++){//从 元素下标为k开始进行遍历
int t=a[i];
int j=i;
for(;j>=gap && t < a[j-gap];j-=gap)
a[j] = a[j-gap];
// while(j>=gap&&t<a[j-gap]){//交换错误位置的数
//
// a[j]=a[j-gap];
// j=j-gap;
// }
a[j]=t;
}
gap/=2;
}
}
int main(void){
int a[8] = {5,3,8,2,4,1,7,6};
int n=8;
shellSort(a,n);
for(int i=0;i<n;i++){
printf("%d\n",a[i]);
}
return 0;
}