几种常用的排序方法7--希尔排序

希尔排序

希尔排序又称为缩小增量排序,它是直接插入排序的一种改进,它的基本思想是:将整个待排记录序列分割成若干个子序列,然后分别对子序列进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行直接插入排序。

上面是数据结构数上话,看起来很绕人,其实很简单,就是一种插入排序,只是如何选取子数列:跳跃选取,每隔一个增量k选取一个数,这些数构成一个子序列(相当于数学中的同余)。一般来说每进行一次shell排序,k的值变为一半,直到为1。

 1 void shell_sort(int * A, int n)
 2 {
 3      int i, j;
 4      int temp; //存放数据的变量 
 5      int k = n/2; //初始选取的增量为长度的一半 
 6      while(k > 0)
 7      {
 8              for(i = k; i < n; i++)
 9              {
10                     temp = A[i];
11                     j = i - k;
12                     while(j >= 0 && temp < A[j])
13                     {
14                             A[j + k] = A[j];  //将较大的数放在后面 
15                             j = j - k;      
16                     }      
17                     A[j + k] = temp; //完成小数与大数的互换 
18              }  
19              k /= 2;      // 选取的增量每次取一半,直到为1 
20      }     
21 }
posted @ 2012-11-22 00:14  缓冲区溢出  阅读(214)  评论(0编辑  收藏  举报