归并排序

来源:互联网 发布:js的数据类型 编辑:程序博客网 时间:2024/06/05 00:29
#include <vector>using namespace std;template <typename Comparable>void mergeSort(vector<Comparable> & a){    vector<Comparable> tmpArray(a.size());  //存放归并结果的数组    mergeSort(a,tmpArray,0,a.size()-1);     //子数组的最左和最右下标}template <typename Comparable>void mergeSort(vector<Comparable> & a,vector<Comparable> & tmpArray,int left,int right){    if (left<right)    {        int center=(left+right)/2;        mergeSort(a,tmpArray, left, center);        mergeSort(a, tmpArray, center+1, right);        merge(a,tmpArray,left,center+1,right);    }}template <typename Comparable>void merge(vector<Comparable> & a,vector<Comparable> & tmpArray,           int leftPos,int rightPos,int rightEnd){    int leftEnd=rightPos-1;    int tmpPos=leftPos;    int numElements=rightEnd-leftPos+1;    //将两数组中的较小者放入临时数组    while (leftPos<=leftEnd&&rightPos<=rightEnd)    {        if (a[leftPos]<=a[rightPos])            tmpArray[tmpPos++]=std::move(a[leftPos++]);        else            tmpArray[tmpPos++]=std::move(a[rightPos++]);    }    //一个数组用完了,则将另一个数组的剩余部分全部放入临时数组    while(leftPos<=leftEnd)        tmpArray[tmpPos++]=std::move(a[leftPos++]);    while(rightPos<=rightEnd)        tmpArray[tmpPos++]=std::move(a[rightPos++]);    //将临时数组复制回原始数组    for(int i=0;i<numElements;++i,--rightEnd)        a[rightEnd]=std::move(tmpArray[rightEnd]);}
原创粉丝点击