各种排序算法简单实现:冒泡、插入、选择、shell(希尔)、归并、快速排序

排序算法集锦:冒泡、插入、选择、shell(希尔)、归并、快速排序

每一轮排序后输出排序结果

#include<iostream>
using namespace std;
void printcur(int *arr,int cnt){
    for(int i=0;i<cnt;i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
}
void bubsort(int *arr,int cnt){
    cout<<"buble sort:"<<endl;
    for(int i=0;i<cnt;i++){
        for(int j=0;j<cnt-i-1;j++){
            if(arr[j]>arr[j+1]){
                int tmp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=tmp;
            }
        }
        printcur(arr,cnt);
    
    }
}
void insertsort(int * arr,int cnt){
    cout<<"insertion sort:"<<endl;
    for(int i=1;i<cnt;i++){
        for(int j=i;j>=0&&arr[j]<=arr[j-1];j--){
            int tmp=arr[j];
            arr[j]=arr[j-1];
            arr[j-1]=tmp;
        }
        printcur(arr,cnt);
    }
}
void selectsort(int * arr,int cnt){
    cout<<"slect sort:"<<endl;
    for(int i=0;i<cnt;i++){
        int min_ind=i;
        for(int j=i+1;j<cnt;j++){
            if(arr[j]<arr[min_ind]){
                min_ind=j;
            }
        }
        int tmp=arr[i];
        arr[i]=arr[min_ind];
        arr[min_ind]=tmp;
        printcur(arr,cnt);
    }
}
void shellsort(int *arr,int cnt){
    cout<<"shell sort:"<<endl;
    int stride=cnt/2;
    while(stride>=1){
        for(int i=0;i<stride;i++){
            for(int j=i;j<cnt-stride;j+=stride){//插入排序的过程
                for(int k=j+stride;k>i&&arr[k]<arr[k-stride];k-=stride){
                        int tmp=arr[k];
                        arr[k]=arr[k-stride];
                        arr[k-stride]=tmp;
                }
                
            }
        }
        printcur(arr,cnt);
        stride/=2;
    }
}
 //以下三个函数是merge sort的相关函数
void merge(int *arr,int *tmp,int s1,int e1,int s2,int e2){
    int i=s1,j=s2;
    int cur=s1;
    while(i<e1&&j<e2){
        if(arr[i]<=arr[j]){
            tmp[cur++]=arr[i];
            i++;
        }
        else{
            tmp[cur++]=arr[j];
            j++;
        }    
    }
    if(i<e1){
        while(i<e1)
            tmp[cur++]=arr[i++];
    }
        
    if(j<e2){
        while(j<e2)
            tmp[cur++]=arr[j++];
    }
    for(int k=s1;k<e2;k++){
        arr[k]=tmp[k];
    }
    
}
void ms(int *arr,int * tmp,int s,int e,int cnt){//开始结束位置
    if(e-s<=1)
        return ;
    ms(arr,tmp,s,(s+e)/2,cnt);
    ms(arr,tmp,(s+e)/2,e,cnt);
    for(int i=s;i<e;i++){
        tmp[i]=arr[i];
    }
    merge(arr,tmp,s,(s+e)/2,(s+e)/2,e);
    printcur(arr,cnt);

}
void mergesort(int *arr,int cnt){ //这个函数主要是为了main函数统一调用接口
    cout<<"merge sort:"<<endl;
    int *tmp=new int[cnt];
    ms(arr,tmp,0,cnt,cnt);
}
//quicksort
int partition(int *arr,int s,int e,int value){
    while(s<e){
        while(arr[++s]<=value);
        while((s<e)&&(arr[--e]>=value));
        int tmp=arr[s];
        arr[s]=arr[e];
        arr[e]=tmp;
    }
    return s;

}

void qsort(int *arr,int s,int e,int cnt){
    if(s>=e)
        return ;
    int pivotindex=(s+e)/2;
    int tmp=arr[pivotindex];
    arr[pivotindex]=arr[e];        //把轴值放到最后的位置上
    arr[e]=tmp;

    int k=partition(arr,s-1,e,tmp);

    tmp=arr[k];
    arr[k]=arr[e];
    arr[e]=tmp;

    printcur(arr,cnt);

    qsort(arr,s,k-1,cnt);
    qsort(arr,k+1,e,cnt);

}
void quicksort(int *arr,int cnt){
    cout<<"quick sort:"<<endl;
    qsort(arr,0,cnt-1,cnt);
}


//main
int main(){
    int n;
    cin>>n;
    int *num=new int[n];
    for(int i=0;i<n;i++){
        cin>>num[i];
    }
    cout<<endl;
    //bubsort(num,n);        //冒泡
    //insertsort(num,n);    //插入
    //selectsort(num,n);    //选择排序
    //shellsort(num,n);        //希尔排序
    //mergesort(num,n);        //归并排序
    quicksort(num,n);        //快速排序
    

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值