希尔排序算法

从根本上而言是对插入排序算法的一种改进。

基本思想:

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。 

 

直接插入排序的作法是:
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。 
第一趟比较前两个数,然后把第二个数按大小插入到有序表中第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。 

 

希尔排序算法实现:

void ShellPass(List R, int d)

{//希尔排序中的一趟排序,d为当前增量  

    for (i = d + 1; i <= n; i++) //R[d+1..n]分别插入各组当前的有序区  

        if (R[i].key < R[i - d].key)

        {

            R[0] = R; j = i - d;//R[0]只是暂存单元,不是哨兵  

            do

            {//查找R的插入位置  

                R[j + d] = R[j];//后移记录  

                j = j - d;//查找前一记录  

            } 

while (j > 0 && R[0].key < R[j].key); R[j + d] = R[0];

//插入R到正确的位置上  

        } //endif  

//ShellPass  

void ShellSort(List R)

{

    int increment = n;

    //增量初值,不妨设n>0  

    do

    {

        increment = increment / 3 + 1;//求下一增量  

        ShellPass(R, increment);//一趟增量为incrementShell插入排序  

    } while (increment > 1);

//ShellSort 

posted @ 2010-05-31 19:14  lcymail  阅读(1563)  评论(3编辑  收藏  举报