三种插入排序

#include "stdio.h"
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
    ElemType r[MAXSIZE+1];
    int length;
}SortList;

void crelist(SortList *L)
{
    int i = 0; ElemType x;
    printf("Input data(-1:End):");
    scanf("%d",&x);
    while(x!=-1)
    {
        if(i>MAXSIZE)
        {--i;break;}
        L->r[++i] = x;
        scanf("%d",&x);
    }
    L->length = i;
}

void list(SortList *L)
{
    int i;
    for(i=1;i<=L->length;i++)
    {
        printf("%5d",i);
    }
    printf("
");
    for(i=1;i<=L->length;i++)
        printf("%5d",L->r[i]);
    printf("
");
}

/*
    直接插入排序算法
    最好情况:T(n) = O(n)
    最坏情况:T(n) = O(n^2)
    平均时间性能为T(n)=O(n^2)
*/
void InsertSort(SortList *L)
{
    int i,j;
    for(i=2;i<=L->length;i++)
    {
        if(L->r[i]<L->r[i-1])
        {
            L->r[0] = L->r[i];
            for(j=i-1;L->r[0]<L->r[j];j--)
                L->r[j+1] = L->r[j];         //比待排序记录关键字大的记录后移
            L->r[j+1] = L->r[0];
        }
    }
}

/*
    折半插入排序算法
    时间复杂度 O(n^2)
*/
void BiInsertSort(SortList *L)
{
    int i,j,low,high,mid;
    for(i=2;i<=L->length;i++)
    {
        L->r[0] = L->r[i];
        low = 1; high = i-1;
        while(low<=high)
        {
            mid = (low+high)/2;
            if(L->r[0]<L->r[mid])
                high = mid - 1;
            else low = mid + 1;
        }
        for(j=i-1;j>=high+1;--j)
            L->r[j+1] = L->r[j];
        L->r[high+1] = L->r[0];
    }
}

//希尔排序   Shell Sort
/*
    时间复杂性O(n^4/3)
*/
void ShellSort(int a[],int length)
{
    int increment;
    int i,j;
    int temp;
    for(increment=length/2;increment>0;increment/=2)    //控制步长,最后递减到1
    {
        for(i=increment;i<length;i++)
        {
            temp = a[i];
            for(j=i-increment;j>=0&&temp<a[j];j-=increment)
            {
                a[j+increment] = a[j];
            }
            a[j+increment] = temp;
        }
    }
}
原文地址:https://www.cnblogs.com/wzqstudy/p/10212419.html