目录
先追求表中元素部分有序,在逐渐逼近表中元素全部有序。
1、我们要升序排列此表

2、取一个差值作为子表的划分的条件,希尔本人建议d=n/2,在本例题中表示为d=8/2=4
于是,我们将相距为4的元素分配到一个子表。

3、分别对它们进行插入排序


4、将d除以2,得到新的间距,并得到新的子表

5、再次进行插入排序

6、再次缩小d的值,此时d为1,将整个表整合,并进行插入排序,得到最后结果

- #include "bits/stdc++.h"
- using namespace std;
-
- void ShellSort(int a[],int n){
- int d,i,j,temp;
- for (d = n/2; d >= 1; d=d/2) {//每次的步长不一样
- for (i = d; i <=n ; ++i) {//从第一个d开始
- if (a[i]//如果此数小于它前面的数
- temp=a[i];//将此数存入缓存变量
- a[j+d] = a[j];//用它们作比较,若比它大则将数前移d位
- }
- a[j+d] = temp;//最后把数插入比它的的最后一个数后面
- }
- }
- }
- }
-
- int main(){
- int count,arr[10];
- scanf("%d",&count);//输入数组长度
- for (int i = 0; i < count; ++i) {
- scanf("%d",&arr[i]);//输入数组
- }
- ShellSort(arr,count);//调用排序函数
- for (int i = 0; i < count; ++i) {
- printf("%d ",arr[i]);//输出数组
- }
- return 0;
- }

O(1);

