对D.L.Shell排序算法的举例分析

其源程序代码如下

 
//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的时候、在中间循环i4的时候 j=0   v0v4交换 数组的取值

3

2

4

7

9

5

1

8

0

0

1

2

3

4

5

6

7

8

gap间隔为4的时候、在中间循环i5的时候 j=1   v1v5交换 数组的取值

3

2

4

7

9

5

1

8

0

0

1

2

3

4

5

6

7

8

gap间隔为4的时候、在中间循环i6的时候 j=2   v2v6交换 数组的取值

3

2

1

7

9

5

4

8

0

0

1

2

3

4

5

6

7

8

gap间隔为4的时候、在中间循环i7的时候 j=3   v3v7交换数组的取值

3

2

1

7

9

5

4

8

0

0

1

2

3

4

5

6

7

8

gap间隔为4的时候、在中间循环i8的时候  j=4   v4v8数组的取值

3

2

1

7

0

5

4

8

9

0

1

2

3

4

5

6

7

8

 

gap间隔为2的时候、在中间循环i2的时候 j=0,  v0v2做交换 数组的取值

1

2

3

7

0

5

4

8

9

0

1

2

3

4

5

6

7

8

gap间隔为2的时候、在中间循环i3的时候 j=1,  v1v3做交换 数组的取值

1

2

3

7

0

5

4

8

9

0

1

2

3

4

5

6

7

8

gap间隔为2的时候、在中间循环i4的时候 j=2  v2v4做交换 v0v2做交换

 数组的取值

0

2

1

7

3

5

4

8

9

0

1

2

3

4

5

6

7

8

 

 

gap间隔为2的时候、在中间循环i5的时候 j=3  v3v5做交换 v1v3做交换

数组的取值

0

2

1

5

3

7

4

8

9

0

1

2

3

4

5

6

7

8

 

gap间隔为2的时候、在中间循环i6的时候 j=4  v4v6做交换 v2v4做交换 v0v2做交换

数组的取值

0

2

1

5

3

7

4

8

9

0

1

2

3

4

5

6

7

8

 

gap间隔为2的时候、在中间循环i7的时候 j=5 v5v7做交换,v3v5做交换 v1v3做交换 数组的取值

0

2

1

5

3

7

4

8

9

0

1

2

3

4

5

6

7

8

 

gap间隔为2的时候、在中间循环i8的时候 j=6 v6v8做交换,v4v6做交换 v2v4做交换 v0v2做交换

数组的取值

0

2

1

5

3

7

4

8

9

0

1

2

3

4

5

6

7

8

 

gap间隔为1的时候、在中间循环i1的时候 j=0 v0v1做交换 数组的取值

0

2

1

5

3

7

4

8

9

0

1

2

3

4

5

6

7

8

 

gap间隔为1的时候、在中间循环i2的时候 j=1 v1v2做交换

数组的取值

0

1

2

5

3

7

4

8

9

0

1

2

3

4

5

6

7

8

 

gap间隔为1的时候、在中间循环i3的时候 j=2 v2v3做交换,v1v2做交换
数组的取值

0

1

2

5

3

7

4

8

9

0

1

2

3

4

5

6

7

8

 

gap间隔为1的时候、在中间循环i4的时候 j=3 v3v4做交换,v2v3做交换 v1v2做交换 v0v1做交换

数组的取值

0

1

2

3

5

7

4

8

9

0

1

2

3

4

5

6

7

8

 

gap间隔为1的时候、在中间循环i5的时候 j=4 v4v5做交换,v3v4做交换 v2v3做交换 v1v2做交换 v0v1做交换

数组的取值

0

1

2

3

5

7

4

8

9

0

1

2

3

4

5

6

7

8

 

gap间隔为1的时候、在中间循环i6的时候 j=5v5v6做交换,v4v5做交换,v3v4做交换 v2v3做交换 v1v2做交换 v0v1做交换

数组的取值

0

1

2

3

4

5

7

8

9

0

1

2

3

4

5

6

7

8

 

gap间隔为1的时候、在中间循环i7的时候 j=6v6v7做交换,v5v6做交换,v4v5做交换,v3v4做交换 v2v3做交换 v1v2做交换 v0v1做交换

数组的取值

0

1

2

3

4

5

7

8

9

0

1

2

3

4

5

6

7

8

gap间隔为1的时候、在中间循环i8的时候 j=7v7v8做交换,v6v7做交换,v5v6做交换,v4v5做交换,v3v4做交换 v2v3做交换 v1v2做交换 v0v1做交换

数组的取值

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 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值