归并排序 MergeSort (C++)

/*
 * MergeSort.h
 * 归并排序
 *  Created on: 2020年2月12日
 *      Author: LuYonglei
 */

#ifndef SRC_MERGESORT_H_
#define SRC_MERGESORT_H_
#include <vector>
using namespace std;

#if 1
//递归实现归并排序

template<typename T>
void merge(vector<T> &arr, vector<T> &leftArray, int begin, int middle,
        int end) {
    //将[begin,middle)和[middle,end)范围内的有序元素合并为一个有序序列
    //左半部分
    int leftIndex = 0;
    int leftEnd = middle - begin;
    //右半部分
    int rightIndex = middle;
    int rightEnd = end;
    //先把[begin,middle)的元素备份出来
    for (int i = 0; i < leftEnd; i++)
        leftArray[i] = arr[begin + i];
    int arrIndex = begin;    //指向被排序数组的索引
    //这里只需要考虑右边先结束的情况,也就是说左边结束了就不用再做其他操作
    //如果左边还没结束
    while (leftIndex < leftEnd) {
        if (rightIndex < rightEnd && arr[rightIndex] < leftArray[leftIndex]) {
            //右边没有结束且右边元素小于左边元素
            //拷贝右边数组到arr
            arr[arrIndex] = arr[rightIndex];
            arrIndex++;
            rightIndex++;

        } else {
            //右边元素大于左边元素或者右边已经结束
            //拷贝左边数组到arr
            arr[arrIndex] = leftArray[leftIndex];
            arrIndex++;
            leftIndex++;
        }
    }
}

template<typename T>
void sort(vector<T> &arr, vector<T> &leftArray, int begin, int end) {
//对数组内[begin,end)的元素进行归并排序
    if ((end - begin) < 2)
        return;
    int middle = (begin + end) / 2;
    sort(arr, leftArray, begin, middle);
    sort(arr, leftArray, middle, end);
    merge(arr, leftArray, begin, middle, end);
}

template<typename T>
void mergeSort(vector<T> &arr) {
//归并排序算法
    vector<T> *leftArray = new vector<T>(arr.size() / 2);
    sort(arr, *leftArray, 0, arr.size());
    delete leftArray;
}

#endif

#endif /* SRC_MERGESORT_H_ */

 

posted @ 2020-02-16 18:12  路璐  阅读(294)  评论(0编辑  收藏  举报