//  MergeSort - 归并排序 - 开始
template<typename Data>
void Merge(Data *a, int s, int m, int e, bool (*cmp)(Data, Data)) {
    Data tmp[e-s+1];
    int pb = 0, p1 = s, p2 = m+1;
    while(p1 <= m && p2 <= e)
        tmp[pb++] = cmp(a[p1], a[p2]) ? a[p1++] : a[p2++];
    while(p1 <= m) tmp[pb++] = a[p1++];
    while(p2 <= e) tmp[pb++] = a[p2++];
    for(int i=0; i<pb; i++) a[s+i] = tmp[i];
}

template<typename Data>
void MergeSort(Data *a, int s, int e, bool (*cmp)(Data, Data)) {
    if(s < e) {
        int m = (s+e)/2;
        MergeSort(a, s, m, cmp);
        MergeSort(a, m+1, e, cmp);
        Merge(a, s, m, e, cmp);
    }
}
//  MergeSort - 归并排序 - 结束

//////////////////////////////////////////////////////////////////////////////////////////

//  QuickSort - 快速排序 - 开始
template<typename Data>
int Partion(Data *a, int left, int right, bool (*cmp)(Data, Data)) {
    Data pivot = a[left];
    while(left < right) {
        while(left < right && cmp(pivot, a[right])) --right;
        if(left < right) a[left++] = a[right];
        while(left < right && cmp(a[left], pivot)) ++left;
        if(left < right) a[right--] = a[left];
    }
    a[left] = pivot;
    return left;
}

template<typename Data>
void QuickSort(Data *a, int left, int right, bool (*cmp)(Data, Data)) {
    if(left < right) {
        int pivotpos = Partion(a, left, right, cmp);
        QuickSort(a, left, pivotpos-1, cmp);
        QuickSort(a, pivotpos+1, right, cmp);
    }
}
//  QuickSort - 快速排序 - 结束

一͛世͛珍͛藏͛
86 声望6 粉丝