1 #include <stdio.h>
2 #include <time.h>
3 #include <stdlib.h>
4
5 void shellsort(int *arr,int len)
6 {
7 int i=0;
8 int n=len/2; //n表示同一组中2个数之间的偏移量
9 while(n>=1) //代表每次除以2后的数为零退出循环相当于给10个数分组详细看图下方
10 { //下面相当于直接插序
11 for(i = n;i<len;i++)
12 {
13 if(arr[i] < arr[i-n]) //第i的元素小于 i - n的元素移动,大于不做任何处理。 第一次 i=5的元素与0位置元素比较,i++后i=6,i与1位置的i比较依次类推,第二次i变为2与0位 置的元素比较依次类推。
14 {
15 int j = i - n;
16 int temp = arr[i];
17 while(temp < arr[j] && j >= 0)//寻找插入位置
18 {
19 arr[j+n] = arr[j];
20 j = j - n;
21 }
22 arr[j+n] = temp;//将元素插入该位置
}
24 }
25 n = n/2;
26 }
27 }
28
29 int main(int argc, char *argv[])
30 {
31 int arr[10]={0};
32 int i = 0;
33 srand((unsigned)time(0)); //生成一个随机数
34 for( i = 0;i<10;i++){
35 arr[i] = rand()%100; //循环生成一个随机数大小在100以类为共10个并打印出来
36 printf("%d ",arr[i]);
37 }
38 printf("\n");
39
40 shellsort(arr,10); //调用shellsort函数
41 for(i = 0;i<10;i++){
42 printf("%d ",arr[i]); //循环打印排序后的数
43 }
printf("\n");
45 return 0;
46 }
结果:
分组图直到所有元素都在一个组类结束该循环