首页 > 代码库 > 20140527 希尔排序

20140527 希尔排序

#include<stdio.h>
void ShellSort(int *a,int length)
{
    int jump=length; int temp=0; int change=1;
    while(jump>0)  //while1
    {
        jump=jump/2;
        change=1;
        /************************************************************************/
        /* 以下while循环表示一个固定步长下的排序
            原始是序列:    3    2    4    7    5    9    6
            第1个for后:    3    2    4    6    5    9    7 chang=1  
            第2个for后:    3    2    4    6    5    9    7    change=0 跳出while2
            步长jump=3/2变为1:
            第1个for之后:    2    3    4    5    6 7 9  chang=1
            第2个for之后:    2    3    4    5    6 7 9  chang=0  跳出while2
            jump=1/2=0:跳出while1  希尔排序结束
        */
        /************************************************************************/
        while(1==change&&jump!=0)//while2
        {
            change=0;
            for(int i=0;i<length-jump;i++)
            {
                if(a[i+jump]<a[i])
                {
                    temp=a[i+jump];
                    a[i+jump]=a[i];
                    a[i]=temp;
                    change=1;
                }
            }
        }
    }
}
void display(int a[],int n)
{
    int i=0;
    while(i<n)
    {
        printf("%d ",a[i]);
        i++;
    }
}
void main()
{
    int a[]={3,2,4,7,5,9,6};
    int length=sizeof(a)/4;
    ShellSort(a,length);
    display(a,length);
}