1. 程式人生 > >排序演算法之直接插入排序和希爾排序

排序演算法之直接插入排序和希爾排序

相信許多人和我一樣,排序演算法看了好幾遍,當時看懂了,過幾天一些細節又忘記,所以現在講排序演算法做一個總結,從最基本的排序演算法展開來,首先分析直接插入排序和希爾排序。
1.直接插入排序
思想:把一個數插入到已經排序的有序序列中;
方法:將這個數與有序序列自右向左比較,若該數較小,則往左移,等價於序列中較大值向右移動。
實現:(在VC6.0下執行通過)

#include<stdio.h>

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])//此數比序列中最後一個數小,則將最後一個數右移一位,與序列中倒數第二個數比較,以此類推 { s[j+1]=s[j]; j--; } s[j+1]=a; } } print(int a[],int n)//列印陣列元素 { int i; for(i=0;i<n;i++) { printf("%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<stdio.h>

void xier_sort(int a[],int n)//從小到大排序
{
    int d;
    int i,j,b;
    d=n/2;
    while(d>=1)//增量小於1時終止
    {
        for(i=d;i<n;i++)
        {
            b=a[i];
            j=i-d;
            while(b<a[j])
            {
                a[j+d]=a[j];
                j=j-d;
            }
            a[j+d]=b;
        }
        d=d/2;
    }
}

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

    while(m<n)
    {
        printf("%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);
}