基于分治法的快速排序和归并排序

归并排序

1) 把前一半排序
2) 把后一半排序
3) 把两半归并到一个新的有序数组,然后再拷贝回原数组,排序完成。

每一个子过程都进行归并排序,整体用分治的思想(递归实现)
时间复杂度为O(nlogn)
是最快的排序算法!

/*
函数mergeayyar()是归并排序算法
函数mergesort()是对每个子过程进行归并排序,最后合并成最终的数组

此算法理解分治的思想不难,关键是搞清楚递归是如何实现分治的 
也是此类算法的关键 
*/ 


#include<iostream>
using namespace std;

//归并 
void mergearray(int a[],int first,int mid,int end,int temp[]){
    int i=0,j=0,k=0,m=0,n=0;
    i=first;
    j=mid+1;
    n=mid;
    while(i<=n&&j<=end){
        if(a[i]<a[j]){
            temp[k]=a[i];
            i++;
        }else{
            temp[k]=a[j];
            j++;
        }
        k++;
    }
    while(i<=n||j<=end){
        if(i<=n){
            temp[k]=a[i];
            i++;
        }else if(j<=end){
            temp[k]=a[j];
            j++;
        }
        k++;    
    }
    for(int t=0;t<end-first+1;t++){
        a[first+t]=temp[t];
    }
} 

//排序 
void mergesort(int a[],int first,int end,int temp[]){
    if(first<end){
        int mid=first+(end-first)/2;
        mergesort(a,first,mid,temp);
        mergesort(a,mid+1,end,temp);
        mergearray(a,first,mid,end,temp);
    }
}

//test 
int main(){
    int a[7]={25,57,48,37,12,92,86};
    int n=7;
    int *p=new int[n];
    mergesort(a,0,n-1,p);
    for(int t=0;t<n;t++){
        cout<<a[t]<<" ";
    }
    delete [] p;
    cout<<endl;
    return 0;
}

这里写图片描述

快速排序

1)设k=a[0], 将k挪到适当位置,使得比k小的元素都在k左边,比k大的元素都在k右边,和k相等的,不关心在k左右出现均可 (O(n)时间完成)
2) 把k左边的部分快速排序
3) 把k右边的部分快速排序
时间复杂度O(nlogn)
速度也很快!

感觉这个比归并排序好理解一点…

/*
快速排序很好理解
关键是分析透如何排序就好了
这个程序不是最好的代码结构,不过是笔者自己解的,所以不想借鉴网上的多数的那个while循环的结构 
*/

#include<iostream>
using namespace std;

//快速排序
int quickArray(int a[],int first,int end,int n){
    int x=a[first];
    int i=first,j=end;
    int k=first;
    while(i<=j){
        if(x>a[j]&&k<j){
            a[k]=a[j];
            a[j]=x;
            k=j;
        }
        if(a[i]>x&&k>i){
            a[k]=a[i];
            a[i]=x;
            k=i;
        }
        j--;
        i++;
    }
    return k;
}

//递归
void quickSort(int a[],int first,int end,int n){
    if(first<end){
        int k=quickArray(a,first,end,n);
        quickSort(a,first,k-1,n);
        quickSort(a,k+1,end,n);
    }
}

//test
int main(){
    int a[8]={7,1,3,8,12,11,2,9};
    int n=sizeof(a)/sizeof(int);
    quickSort(a,0,n-1,n);
    for(int i=0;i<n;i++){
        cout<<a[i]<<" ";
    }
    cout<<endl;
    return 0;
}

这里写图片描述

编译器中自带快速排序函数qsort(),具体用法自行google

猜你喜欢

转载自blog.csdn.net/a_chen666/article/details/77679358