数据结构与算法-----归并排序

归并排序(递归合并)
平均时间复杂度O(2NlogN),稳定,对数据有序性不敏感,非就地排序,不适用于对海量数据进行排序。

void remoteMerge(int *arr1,int size1,int *arr2,int size2,int *arr3)
此函数属于异地合并,arr1和arr2已经是排好的数据,size1和size2是数组的元素个数,arr3是排序合并的结果数组。
void localMerge(int *arr,int left,int middle,int right)
此函数是本地合并,在数组arr中,left–middle元素之间的和middle+1与right之间的都是按升序排好的数据,然后调用异地合并的方法函数进行合并,合并的结果依然存在arr中。
void mergeSort(int *data,int left,int right)
此函数利用递归思想结合本博客中本地合并的方法实现了排序,left是左边界,right是右边界。

#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
/*异地合并(将合并的结果放在新的数组中)*/
void remoteMerge(int *arr1,int size1,int *arr2,int size2,int *arr3){
    int i=0,j=0,k=0; 
    for(;;){
        if(i<size1 && j<size2){
            if(arr1[i]<=arr2[j]){
                arr3[k++]=arr1[i++];
            }
            else
                arr3[k++]=arr2[j++];        
        }
        else if(i<size1)
            arr3[k++]=arr1[i++];
        else if(j<size2)
            arr3[k++]=arr2[j++];
        else
            break;
    }
}
/*本地合并(将合并的结果放在当前数组中,-->调用异地合并方法)*/
void localMerge(int *arr,int left,int middle,int right){
    int size=right-left+1;
    int res[size];
    remoteMerge(arr+left,middle-left+1,arr+middle+1,right-middle,res);
    for(int i=0;i<size;++i)
        arr[left+i]=res[i];
}
/*归并排序(使用递归的思想调用本地合并方法的一种排序方法)*/
void mergeSort(int *data,int left,int right){
    if(left<right){ 
        int middle=(left+right)/2;
        mergeSort(data,left,middle);
        mergeSort(data,middle+1,right);
        localMerge(data,left,middle,right);
    }
}
int main(){ 
/*测试异地合并    
    int arr1[11]={-12,1,3,5,7,9,10,12,13,14,20};
    int arr2[11]={-2,0,2,4,6,8,10,12,14,16,17};
    int arr3[22]={0};
    remoteMerge(arr1,11,arr2,11,arr3);
    for(int i=0;i<22;++i){
        cout<<arr3[i]<<' ';
    }
    cout << endl;
*/  
/*测试本地合并
    int arr4[10]={25,26,28,100,2,3,4,5,23,120};
    localMerge(arr4,0,3,9);
    for(int i=0;i<10;++i){
        cout<<arr4[i]<<' ';
    }
    cout << endl;   
*/
/*测试归并排序*/
    int *data=new int;
    int size;
    cout<<"Pls input the size:";
    cin>>size;
    srand(time(0));
    for(int i=0;i<size;++i){
//      *(data+i)=rand()%100;
        data[i]=rand()%100;
    }
    mergeSort(data,0,size-1);
    for(int i=0;i<size;++i){
        cout<<data[i]<<' ';
    }   
    cout << endl;

    return 0;   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值