排序

插入排序:直接插入排序,折半插入排序,希尔排序

交换排序:冒泡排序,快速排序

选择排序:简单选择排序,堆排序

归并排序

基数排序

#include <stdio.h>
#include <stdlib.h>
void InsertSort(int A[],int n){
    int B[7];
    int i,j;
    for(int i=1;i<=n;i++){
        B[i]=A[i];
    }//生成一个新的数组保持原数组不变
    for(i=2;i<=n;i++){
        if(B[i]<B[i-1]){
            B[0]=B[i];
            for(j=i-1;B[0]<B[j];--j){
                B[j+1]=B[j];
            }
            B[j+1]=B[0];
        }
    }
    printf("直接插入排序后的数组:");
    for(int i=1;i<=n;i++){
        printf("%d ",B[i]);
    }
    printf("\n");
}//直接插入排序
void BInsertSort(int A[],int n){
    int low,high,mid;
    int i,j;
    int B[7];
    for(int i=1;i<=n;i++){
        B[i]=A[i];
    }
    for(i=2;i<=n;i++){
        B[0]=B[i];
        low=1;
        high=i-1;
        while(low<=high){
            mid=(low+high)/2;
            if(B[mid]>B[0]){
                high=mid-1;
            }
            else{low=mid+1;}
        }
        for(j=i-1;j>=high+1;j--){
            B[j+1]=B[j];
        }
        B[high+1]=B[0];
    }
    printf("折半插入排序后的数组:");
    for(int i=1;i<=n;i++){
        printf("%d ",B[i]);
    }
    printf("\n");
}//折半插入排序
void ShellSort(int A[],int n){
    int B[7];
    int i,j;
    for(int i=1;i<=n;i++){
        B[i]=A[i];
    }
    int dk=n/2;//记录前后位置的增量
    while(dk>=1){
        for(i=dk+1;i<=n;i++){
            if(B[i]<B[i-dk]){
                B[0]=B[i];
                for(j=i-dk;j>0&&B[0]<B[j];j=j-dk){
                    B[j+dk]=B[j];
                }
                B[j+dk]=B[0];
            }
        }
        dk=dk/2;
    }
    printf("希尔排序后的数组:");
    for(int i=1;i<=n;i++){
        printf("%d ",B[i]);
    }
    printf("\n");
}//希尔排序
void BubbleSort(int A[],int n){
    int B[7];
    for(int i=1;i<=n;i++){
        B[i]=A[i];
    }
    for(int i=1;i<=n-1;i++){
        for(int j=n;j>i;j--){
            if(B[j]<B[j-1]){
                B[0]=B[j-1];
                B[j-1]=B[j];
                B[j]=B[0];
            }
        }
    }
    printf("冒泡排序后的数组:");
    for(int i=1;i<=n;i++){
        printf("%d ",B[i]);
    }
    printf("\n");
}//冒泡排序

int Partition(int B[],int low,int high){
    int piovt=B[low];
    while(low<high){
        while(low<high&&B[high]>=piovt){
            high--;
        }
        B[low]=B[high];//找到比枢轴值小的,将其放在枢轴值的左边
        while(low<high&&B[low]<=piovt){
            low++;
        }
        B[high]=B[low];//找到比枢轴值大的,将其放在数值值的右边
    }
    B[low]=piovt;//枢轴值最终确定的位置
    return low;
}//快速排序划分算法
void QuickSort(int B[],int low,int high){
    if(low<high){
        int pivotpos=Partition(B,low,high);//将数组划分为两部分的指针
        QuickSort(B,low,pivotpos-1);
        QuickSort(B,pivotpos+1,high);
    }
}//快速排序
void Qsort(int A[],int n){
    int low=0,high=n-1;
    int B[6];
    for(int i=1;i<=n;i++){
        B[i-1]=A[i];
    }
    QuickSort(B,low,high);
    printf("快速排序后的数组:");
    for(int i=0;i<n;i++){
        printf("%d ",B[i]);
    }
    printf("\n");
}//快速排序总体算法
void SelectSort(int B[],int n){
    int min;//记录最小值的位置
    int temp;
    for(int i=0;i<n-1;i++){
        min=i;
        for(int j=i+1;j<n;j++){
            if(B[j]<B[min]){
                min=j;
            }
        }
        if(i!=min){
            temp=B[i];
            B[i]=B[min];
            B[min]=temp;
        }
    }
}//简单选择排序
void Ssort(int A[],int n){
    int B[6];
    for(int i=1;i<=n;i++){
        B[i-1]=A[i];
    }
    SelectSort(B,n);
    printf("简单选择排序后的数组:");
    for(int i=0;i<n;i++){
        printf("%d ",B[i]);
    }
    printf("\n");
}//简单选择排序总体算法
void AdjustDown(int B[],int k,int n){
    B[0]=B[k];
    for(int i=2*k;i<=n;i=i*2){
        if(i<n&&B[i]<B[i+1]){
            i++;
        }
        if(B[0]>=B[i]){break;}
        else{
            B[k]=B[i];
            k=i;
        }
    }
    B[k]=B[0];
}//将元素进行向下调整
void BuildMaxHeap(int B[],int n){
    for(int i=n/2;i>0;i--){
        AdjustDown(B,i,n);//反复调整堆,直至堆满足大根堆
    }
}//建立大根堆
void HeapSort(int A[],int n){
    int B[7];
    int temp;
    for(int i=1;i<=n;i++){
        B[i]=A[i];
    }
    BuildMaxHeap(B,n);
    for(int i=n;i>1;i--){
        temp=B[i];
        B[i]=B[1];
        B[1]=temp;//堆顶和堆底元素互换
        AdjustDown(B,1,i-1);//把剩下i-1个元素整理成堆
    }
    printf("堆选择排序后的数组:");
    for(int i=1;i<=n;i++){
        printf("%d ",B[i]);
    }
    printf("\n");
}//堆排序
void Merge(int B[],int low,int mid,int high){
    int T[7];//归并排序辅助数组
    for(int k=low;k<=high;k++){
        T[k]=B[k];
    }
    int i=low;
    int j=mid+1;
    int k=i;
    while(i<=mid&&j<=high){
        if(T[i]<=T[j]){B[k]=T[i++];}
        else {B[k]=T[j++];}//比较左右两端中元素,将最小者复制到B中
        k++;
    }
    while(i<=mid){B[k++]=T[i++];}//若左边的元素未复制完
    while(j<=high){B[k++]=T[j++];}//若右边的元素未复制完
}//将一个表的左右两端(各自有序),合成一个新的表
void MergeSort(int B[],int low,int high){
    if(low<high){
        int mid=(low+high)/2;
        MergeSort(B,low,mid);
        MergeSort(B,mid+1,high);
        Merge(B,low,mid,high);
    }
}
void MSort(int A[],int n){
    int B[6];
    int low=0;
    int high=n-1;
    for(int i=1;i<=n;i++){
        B[i-1]=A[i];
    }
    MergeSort(B,low,high);
    printf("归并排序后的数组:");
    for(int i=0;i<n;i++){
        printf("%d ",B[i]);
    }
    printf("\n");
}
void main(){
    int n=6;
    int A[7]={-1,4,5,1,2,6,3};//0号元素一般不放关键字,这里以-1代替
    printf("当前数组:");
    for(int i=1;i<=n;i++){
        printf("%d ",A[i]);
    }
    printf("\n");
    InsertSort(A,n);
    BInsertSort(A,n);
    ShellSort(A,n);
    BubbleSort(A,n);
    Qsort(A,n);
    Ssort(A,n);
    HeapSort(A,n);
    MSort(A,n);
}

posted on 2019-09-18 20:34  一仟零一夜丶  阅读(250)  评论(0)    收藏  举报