排序(插入,归并)

1.Insert sort

 

 

 

 

#include<iostream>
using namespace std;
int a[50];
int n;
void in_sort(){
    for(int i=2;i<=n;i++){
        for(int j=i;j>1;j--){
            if(a[j]<a[j-1]){
                int t=a[j];
                a[j]=a[j-1];
                a[j-1]=t;
            }
        }
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    in_sort();
    for(int i=1;i<=n;i++){
        cout<<a[i]<<' ';
    }
    return 0;
}

空间复杂度:O(1)

时间复杂度:O(n^2)

最优时间复杂度:already sorted array 外层n,内层1 O(n)

最坏时间复杂度:reversly sorted array O(n^2)

 

2.merge sort

“分治的思想”

divide and conquer

 

#include<iostream>
using namespace std;
int a[50];
int n;
void merge(int a[],int L,int M,int R){
    int left_v=M-L+1;
    int right_v=R-M;
    int left[left_v];
    int right[right_v];
    //fill in the left sub array
    for(int i=L;i<=M;i++){
        left[i-L+1]=a[i];
    }
    //fill in the right sub array
    for(int i=M+1;i<=R;i++){
        right[i-M]=a[i];
    }
    //merge into the original array
    int i=1;int j=1;int k=L;
    while(i<=left_v && j<=right_v){
        if(left[i] < right[j]){
            a[k]=left[i];
            i++;
            k++;
        }else{
            a[k]=right[j];
            j++;
            k++;
        }
    }
    while(i<=left_v){
        a[k]=left[i];
        i++;
        k++;
    }
    while(j<=right_v){
        a[k]=right[j];
        j++;
        k++;
    }
}
void divide(int a[],int L,int R){
    if(L == R){
        return;
    }
    int mid=(L+R)/2;
    divide(a,L,mid);
    divide(a,mid+1,R);
    merge(a,L,mid,R);
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    int L=1;
    int R=n;
    int mid=(L+R)/2;
    divide(a,L,R);
    for(int i=1;i<=n;i++){
        cout<<a[i]<<' ';
    } 
    return 0;
}

 

时间复杂度:Merge-Sort is O(nlogn), the reversed order does not affect the split and merge.

 

posted on 2020-04-20 13:59  二进制dd  阅读(112)  评论(0编辑  收藏  举报

导航