zoukankan      html  css  js  c++  java
  • 三种插入排序

    #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;
            }
        }
    }
  • 相关阅读:
    uva 11488
    探测器-旅行者1号:百科
    理论-生命起源理论:百科
    定律:目录
    定律:百科
    理论:目录
    理论(哲学):百科
    理论:百科
    汉语-词语:潮汐
    物理-电磁-电磁相互作用:百科
  • 原文地址:https://www.cnblogs.com/wzqstudy/p/10212419.html
Copyright © 2011-2022 走看看