归并排序

来源:互联网 发布:mac r语言安装 编辑:程序博客网 时间:2024/05/01 03:23

书看到归并排序这一部分的时候,感觉java中乱七八糟的接口、基本类型和泛型输入输出的问题真是影响对算法的理解,还是直接用C++实现比较直接。

#include <iostream>using namespace std;// 这样写可能效率不咋地,但思路比较清晰void merge(int a[],int low,int mid,int high){    int l=mid-low+1;    int r=high-mid;    int *left=new int[l];    for(int i=0; i<l; i++)    {        left[i]=a[low+i];    }    int *right=new int[r];    for(int j=0; j<r; j++)    {        right[j]=a[mid+1+j];    }    int i=0,j=0;    // 归并回到a[low...high]    for(int k=low; k<=high; k++)    {        if(i>=l) a[k]=right[j++];        else if(j>=r) a[k]=left[i++];        else if(left[i]<right[j]) a[k]=left[i++];        else a[k]=right[j++];    }    delete left;    delete right;}void merge_sort(int a[],int low,int high){    if(low>=high) return;    int mid=low+(high-low)/2;    merge_sort(a,low,mid);// 将左半边排序    merge_sort(a,mid+1,high);// 将右半边排序    merge(a,low,mid,high);// 归并结果}void show(int a[],int n){    for(int i=0; i<n; i++)    {        cout<<a[i]<<" ";    }    cout<<endl;}int main(){    int a[10]= {3,6,2,7,9,0,8,1,4,5};    show(a,10);    merge_sort(a,0,9);    show(a,10);    return 0;}


0 0