直接插入排序,折半插入排序,希尔排序的C语言实现

#include<stdio.h>
#define Elemtype int

void Printf(Elemtype A[],int n){
    
    
    int t;
    for(t = 1;t<n;t++ ){
    
    
        printf("%d ,",A[t]);
    }
}

/************直接插入排序*************/
void InsertSort(Elemtype A[],int n){
    
    
    int i , j;
    for(i=2;i<=n;++i){
    
    
        if(A[i]<A[i-1]){
    
    
            A[0]=A[i];
            for(j=i-1;A[j]>A[0];--j){
    
    
                A[j+1]=A[j];
            }
            A[j+1]=A[0];
        }
    }
   Printf(A,9);
}


/**********折半插入排序*******/
void Half_insertion_sort(Elemtype A[],int n){
    
    
    int i,j,low,high,mid;
    for(i=2;i<=n;++i){
    
    
        A[0]=A[i];
        low = 1;
        high = i-1;
        while(low<=high){
    
    
            mid = (low+high)/2;
            if(A[mid]>A[0]){
    
    
                high=mid-1;
            }else{
    
    
                low=mid+1;
            }
        }
        for(j=i-1;j>=high+1;--j){
    
    
            A[j+1]=A[j];
        }
        A[high+1]=A[0];
                  //这一步也可以写成A[low]=A[0];
    }
    Printf(A,9);
}

/*******希尔排序*******/
void ShellSort(Elemtype A[],int n){
    
    
    /*这个A[0]只是作为一个暂存的单元,而不是哨兵*/
    int i,j;
    for(int dk=n/2;dk>1;dk=dk/2){
    
    
        for(i=dk+1;i<=n;++i){
    
    
            if(A[i]<A[i-dk]){
    
    
                A[0]=A[i];
            for(j=i-dk;j>0&&A[0]<A[j];j-=dk){
    
    
                A[j+dk]=A[j];
            }
            A[j+dk]=A[0];
            }
        }

    }
    Printf(A,8);
}
int main(){
    
    
    Elemtype A[9] = {
    
    0,1,3,2,4,6,5,7,8};
    printf("原数组为:");
    Printf(A,8);
    printf("\n");


    printf("直接插入排序:");
    InsertSort(A,8);
    printf("\n");

    printf("折半插入排序:");
    Half_insertion_sort(A,8);
    printf("\n");

    printf("希尔排序:");
    ShellSort(A,8);
    printf("\n");
}

猜你喜欢

转载自blog.csdn.net/qq_43964318/article/details/108345824
今日推荐