分治法之归并排序

来源:互联网 发布:淘宝骗术大全 编辑:程序博客网 时间:2024/06/03 16:01

先上图:
这里写图片描述

归并排序的关键:
1.将待排序的数组分割,一直分到只有一个数.(那么这个数必然是排好序的)。
2.将分割后的原子级别的数两两合并,最后产生结果,并填充到原数组中!

#include <iostream>using namespace std;int a[100];int n;//数组长度 void merge(int arr[],int L,int M,int R){    //M为分割位置,M的左边为排好序的,M以及M的右边也是排好序的     int left_size=M-L;//左序列数组大小     int right_size=R-M+1;//右序列数组大小     int left[left_size];//存储左序列     int right[right_size];//用于存储右序列     for(int i=L;i<M;i++){        left[i-L]=a[i];//填充左数组     }    for(int i=M;i<=R;i++){        right[i-M]=a[i];//填充右数组     }    int i=0;int j=0;int k=L;    while(i<left_size&&j<right_size){        if(left[i]<right[j]){            a[k++]=left[i++];        }        else{            a[k++]=right[j++];        }    }    while(i<left_size){        a[k++]=left[i++];    }    while(j<right_size){        a[k++]=right[j++];    }}int mergeSort(int arr[],int L,int R){    if(L==R){//递归的终止条件         return 0;    }    else{        int M=(L+R)/2;//取分割位置         mergeSort(a,L,M);//递归划分数组左序列         mergeSort(a,M+1,R);//递归划分数组右序列         merge(a,L,M+1,R);//数组合并操作     }}int main() {    cout<<"请输入要排序的数组大小:"<<endl;    cin>>n;    cout<<"请输入要排序的数组:"<<endl;    for(int i=0;i<n;i++){        cin>>a[i];    }    mergeSort(a,0,n-1);    for(int i=0;i<n;i++){        cout<<a[i]<<"   ";    }    return 0;}