希尔排序分析

在分析希尔排序之前先看插入排序:

 1 void InsertSort(int A[],int N)
2 {
3 int j,p,temp;
4 for(p=1;p<N;p++)
5 {
6 temp=A[p];
7 for(j=p;j>0&&A[j-1]>temp;j--)
8 {
9 A[j]=A[j-1];
10 }
11 A[j]=temp;
12 }
13 }

从第4行可以看出,插入元素从第一个开始(前面有第0个)。通过第7行到第10行的循环找出插入元素所在的位置,然后通过第11行语句将要插入的元素放入。

这里注意每次插入都是从待插入的元素位置处开始进行位置查找,而不是从数组的最后处开始。

下面的代码为希尔排序代码:

 1 void Shell_Sort(int a[], int n) 
2 {
3 int h,i,j,temp;
4 for (h=n/2; h>0; h=h/2)
5 {
6 for (i=h; i<n; i++)
7 {
8 temp = a[i];
9 for (j=i-h; j>=0 && temp < a[j]; j-=h)
10 {
11 a[j+h] = a[j];
12 }
13 a[j+h] = temp;
14 }
15 }
16
17 }

希尔排序的思想和插入排序的思想相同,都是从第一个(前面有第0个)开始向前面插入数据。只不过希尔排序是对隔一个增量的数据进行排序,所隔的增量为一递减的增量序列。

在希尔排序中第9行到第12行代码的作用和插入排序的作用相同,对相隔h的数据进行插入排序。h满足SHELL序列:N'=N/2。在上面的例子中为1,2,5……。

排序过程可以表示为如下形式:

h=5:

10|9|8|7|6

5  |4|3|2|1

h=2:

10|9

8  |7

6  |5

4  |3

2  |1

h=1:

10

9

8

7

6

5

4

3

2

1

每次排序都只对各列的数据进行排序。

当h取一个值后,第6行代码扫描各列,第8~13行代码完成对各列的排序。

你可能感兴趣的:(希尔排序)