排序算法之直接插入排序和希尔排序

相信许多人和我一样,排序算法看了好几遍,当时看懂了,过几天一些细节又忘记,所以现在讲排序算法做一个总结,从最基本的排序算法展开来,首先分析直接插入排序和希尔排序。
1.直接插入排序
思想:把一个数插入到已经排序的有序序列中;
方法:将这个数与有序序列自右向左比较,若该数较小,则往左移,等价于序列中较大值向右移动。
实现:(在VC6.0下运行通过)

#include

void sort(int s[],int n)//从小到大排序
{
    int i,j,a;
    for(i=1;i<=n;i++)
    {
        a=s[i];//a做临时变量,存储比较的值,防止数组右移将其覆盖
        j=i-1;
        while(a//此数比序列中最后一个数小,则将最后一个数右移一位,与序列中倒数第二个数比较,以此类推
        {
            s[j+1]=s[j];
            j--;
        }
        s[j+1]=a;
    }
}
print(int a[],int n)//打印数组元素
{
    int i;
    for(i=0;iprintf("%d",a[i]);
    }
    printf("\n");
}

void main()
{
    int a[5]={5,8,4,3,9};
    print(a,5);
    sort(a,5);
    print(a,5);
}

2.希尔排序
思想:希尔排序是直接插入排序的改进
方法:将序列分为若组,分组不是逐段分的,而是设置一个增量d,距离为d的倍数为一组,再将d=d/2进行分组,直至d=1,最后使用直接插入排序算法进行排序。
分析:数组a[10]={5,8,4,3,9,6,1,7,2,10}
5 8 4 3 9 6 1 7 2 10
第一趟:n=10,d=n/2=5
5 - - - - 6
8 - - - - 1
4 - - - - 7
3 - - - - 2
9 - - - -10
得到:5 1 4 2 9 6 8 7 3 10
第二趟:d=d/2=2
5 - 4 - 9 - 8 - 3
1 - 2 - 6 - 7 - 10
得到:3 1 4 2 5 6 8 7 9 10
第三趟:d=d/2=1
得到:1 2 3 4 5 6 7 8 9 10
实现:

#include

void xier_sort(int a[],int n)//从小到大排序
{
    int d;
    int i,j,b;
    d=n/2;
    while(d>=1)//增量小于1时终止
    {
        for(i=d;iwhile(b2;
    }
}

void print(int a[],int n)
{
    int m=0;

    while(mprintf("%d ",a[m]);
        m++;
    }
    printf("\n");
}

void main()
{
    int a[10]={5,8,4,3,9,6,1,7,2,10};
    print(a,10);
    xier_sort(a,10);
    print(a,10);
}

你可能感兴趣的:(经典排序算法)