插入排序

直接插入排序

void InsertSort(int A[],int n) {
    int i,j;
    for(i=2; i<=n; i++) {//依次将A[2]~A[n]插入到前面已经排序的序列
        if(A[i]<A[i-1]) {//若A[i]的关键码小于其前驱,需要将A[i]插入有序表
            A[0]=A[i];//复制为哨兵,A[0]不存放元素
            for(j=i-1; A[0]<A[j]; --j)//从后往前查找待插入的位置
                A[j+1]=A[j];//向后挪位
            A[j+1]=A[0];//复制到插入位置
        }
    }
}

折半插入排序

void InsertSort(int A[],int n) {
    int i,j,low,high,mid;
    for(i=2; i<=n; i++) {//依次将A[2]~A[n]插入到前面已排序序列 
        A[0]=A[i];//将A[i]暂存到A[0] 
        low=1;high=i-1;//设置折半查找的范围 
        while(low<=high) {//半查找(默认递增有序) 
            mid=(low+high)/2;
            if(A[0]>A[mid])low=mid+1;
            else
                high=mid-1;
        }
        for(j=i-1; j>=high+1; j--)
            A[j+1]=A[j];//统一后移元素,空出插入位置 
        A[high+1]=A[0];//插入操作 
    }
}

希尔排序

void ShellSort(int A[],int n) {
    int i,j;//A[0]只是暂存单元,不是哨兵,当j<=0时,插入位置已到 
    for(int d=n/2; d>=1; d=d/2) {//步长变化 
        for( i=d+1; i<=n; i++) {
            if(A[i]<A[i-d]) {//需将A[i]插入有序增量子表 
                A[0]=A[i];//暂存在A[0] 
                for(j=i-d; j>0&&A[0]<A[j]; j-=d)
                    A[j+d]=A[j];//记录后移,查找插入位置 
                A[j+d]=A[0];//插入 
            }
        }
    }
}
原文地址:https://www.cnblogs.com/tianyudizhua/p/13414926.html