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

来源:互联网 发布:c语言node类型 编辑:程序博客网 时间:2024/06/03 23:43

归并排序

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);    }}//testint 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