zl程序教程

您现在的位置是:首页 >  后端

当前栏目

30排序算法之希尔排序

算法排序 30 希尔
2023-09-11 14:21:07 时间

排序算法之希尔排序

 

基本原理:

Donald.L.Shell设计的排序算法。

特点:

(1)缩小增量  

(2)多遍插入排序

 例如,选用增量序列(9,5,3,1)

  4个增量,进行4遍插入排序  。

术语:

 h-排序(h-sorted)

h-子序列(h-subsequence)

  h-有序的(h-ordered) 

 

 

希尔排序算法

void Shell_sort(int a[ ],int d[ ],int n,int t)

   { int  i,j,h,k,x;

1.  for(h=0;h<t;h++)

2.    {    k=d[h];    //当前增量为k

3.          for(i=k;i<n;i++)

4.            {  for(x=a[i],j=i-k;j>=0&&x<a[j];)

5.                  {   a[j+k]=a[j];     j-=k;   }

6.              a[j+k]=x;  //x就位

               }

           }

      }

 

 

示例

 

希尔排序源代码:
//希尔排序
void ShellSort(int arr[],int n)
{
    int i,j,temp;
    int d = n;
    do
    {
        d = d/3 + 1;
        for(i=d;i<n;i++)
        {
            if(arr[i] < arr[i-d])
            {
                temp = arr[i];
                for(j=i-d;j>=0&&arr[j]>temp;j-=d)
                {
                    arr[j+d] = arr[j];
                }
                arr[j+d] = temp;
            }
        }
    }while(d>1); 
}

int main()
{
    int arr[10]={3,5,8,2,4,13,9,1,16,7};
    ShellSort(arr,10);
    for(int i=0;i<10;++i)
        printf("%d ",arr[i]);
    getchar();
    return 0;
}