其源程序代码如下
//shell排序算法
3
4 void shellsort(int v[],int n){
5
6 int gap,i,j,temp;
7
8 for(gap=n/2;gap>0;gap/=2){
9 for(i=gap;i<n;i++){
10 for(j=i-gap;j>=0&& v[j]>v[j+gap];j-=gap){
11 temp=v[j];
12 v[j]=v[j+gap];
13 v[j+gap]=temp;
14 }
15 }
16 }
17 }
这是一个我随便举例的一个数组
3 | 2 | 4 | 7 | 9 | 5 | 1 | 8 | 0 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为4的时候、在中间循环i为4的时候 j=0 v0和v4交换 数组的取值
3 | 2 | 4 | 7 | 9 | 5 | 1 | 8 | 0 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为4的时候、在中间循环i为5的时候 j=1 v1和v5交换 数组的取值
3 | 2 | 4 | 7 | 9 | 5 | 1 | 8 | 0 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为4的时候、在中间循环i为6的时候 j=2 v2和v6交换 数组的取值
3 | 2 | 1 | 7 | 9 | 5 | 4 | 8 | 0 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为4的时候、在中间循环i为7的时候 j=3 v3和v7交换数组的取值
3 | 2 | 1 | 7 | 9 | 5 | 4 | 8 | 0 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为4的时候、在中间循环i为8的时候 j=4 v4和v8数组的取值
3 | 2 | 1 | 7 | 0 | 5 | 4 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为2的时候、在中间循环i为2的时候 j=0, v0和v2做交换 数组的取值
1 | 2 | 3 | 7 | 0 | 5 | 4 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为2的时候、在中间循环i为3的时候 j=1, v1和v3做交换 数组的取值
1 | 2 | 3 | 7 | 0 | 5 | 4 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为2的时候、在中间循环i为4的时候 j=2 v2和v4做交换 v0和v2做交换
数组的取值
0 | 2 | 1 | 7 | 3 | 5 | 4 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为2的时候、在中间循环i为5的时候 j=3 v3和v5做交换 v1和v3做交换
数组的取值
0 | 2 | 1 | 5 | 3 | 7 | 4 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为2的时候、在中间循环i为6的时候 j=4 v4和v6做交换 v2和v4做交换 v0和v2做交换
数组的取值
0 | 2 | 1 | 5 | 3 | 7 | 4 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为2的时候、在中间循环i为7的时候 j=5 ;v5和v7做交换,v3和v5做交换 v1和v3做交换 数组的取值
0 | 2 | 1 | 5 | 3 | 7 | 4 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为2的时候、在中间循环i为8的时候 j=6 ;v6和v8做交换,v4和v6做交换 v2和v4做交换 v0和v2做交换
数组的取值
0 | 2 | 1 | 5 | 3 | 7 | 4 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为1的时候、在中间循环i为1的时候 j=0 ;v0和v1做交换 数组的取值
0 | 2 | 1 | 5 | 3 | 7 | 4 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为1的时候、在中间循环i为2的时候 j=1 ;v1和v2做交换
数组的取值
0 | 1 | 2 | 5 | 3 | 7 | 4 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为1的时候、在中间循环i为3的时候 j=2 ;v2和v3做交换,v1和v2做交换
数组的取值
0 | 1 | 2 | 5 | 3 | 7 | 4 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为1的时候、在中间循环i为4的时候 j=3 ;v3和v4做交换,v2和v3做交换 v1和v2做交换 v0和v1做交换
数组的取值
0 | 1 | 2 | 3 | 5 | 7 | 4 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为1的时候、在中间循环i为5的时候 j=4 ;v4和v5做交换,v3和v4做交换 v2和v3做交换 v1和v2做交换 v0和v1做交换
数组的取值
0 | 1 | 2 | 3 | 5 | 7 | 4 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为1的时候、在中间循环i为6的时候 j=5;v5和v6做交换,v4和v5做交换,v3和v4做交换 v2和v3做交换 v1和v2做交换 v0和v1做交换
数组的取值
0 | 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为1的时候、在中间循环i为7的时候 j=6;v6和v7做交换,v5和v6做交换,v4和v5做交换,v3和v4做交换 v2和v3做交换 v1和v2做交换 v0和v1做交换
数组的取值
0 | 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
在gap间隔为1的时候、在中间循环i为8的时候 j=7;v7和v8做交换,v6和v7做交换,v5和v6做交换,v4和v5做交换,v3和v4做交换 v2和v3做交换 v1和v2做交换 v0和v1做交换
数组的取值
0 | 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
对D.L.Shell排序算法的总结
在D.L.Shell排序算法中:首先把一堆数据中的数据分成组,确定一个间隔 每组的两个数据是由一个间隔gap决定的,分别对每组数据进行排序,排好序以后在调节间隔的大小,然后每次排好一组数据以后,要进行更新前面的数据,有种递归的感觉。
for(gap=n/2;gap>0;gap/=2),这个循环就是控制间隔的,当间隔为0时,已经排好序了,间隔初始值取gap=n/2 有种折半查找的意思
9 for(i=gap;i<n;i++){
10 for(j=i-gap;j>=0&& v[j]>v[j+gap];j-=gap){
这个两个循环联合起来是遍历每一组数据
注意这两个循环的初值 这是一个思想上的重点 还有第二个循环中 j-=gap 这个循环变量的变化表达式
下面也是它的一份源程序代码,和开头的一样
//shell排序算法
3
4 void shellsort(int v[],int n){
5
6 int gap,i,j,temp;
7
8 for(gap=n/2;gap>0;gap/=2){
9 for(i=gap;i<n;i++){
10 for(j=i-gap;j>=0&& v[j]>v[j+gap];j-=gap){
11 temp=v[j];
12 v[j]=v[j+gap];
13 v[j+gap]=temp;
14 }
15 }
16 }
17 }
18