清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
/******************************
*mergeSort
******************************/
#include "stdafx.h"
#include <vector>
using namespace std;
template <typename T>
void mergeSort(vector<T>& vec)
{
vector<T> tempVec(vec.size());
mergeSort(vec, tempVec, 0, vec.size()- 1);
}
template <typename T>
void mergeSort(vector<T>& vec, vector<T> tempVec, int left, int right)
{
if (left < right)
{
int center = (left + right)/2;
mergeSort(vec, tempVec, left, center);
mergeSort(vec, tempVec, center+1, right);
mergeFunc(vec, tempVec, left, center+1 , right); //合并
}
};
//合并函数
template <typename T>
void mergeFunc(vector<T>& vec, vector<T> tempVec, int left, int Pos,int right)
{
int leftPos = left; //左边序列的位置,初始为左序列起点
int leftEnd = Pos-1 ; //左边序列的终点
int rightPos = Pos; //右边序列的位置,初始为右序列起点
int rightEnd = right; //右边序列的终点
int tempPos = left; //临时数组的位置,初始为临时数组的起点
int numElements = right - left + 1; //数组元素的个数
//两段数组合并
//两段数组已有序
while (leftPos <= leftEnd && rightPos <= rightEnd) //左边数组和右边数组都没有到终点
{
//比较左边数组和右边数组值的大小
//把较小者放入临时数组
if (vec[leftPos] <= vec[rightPos])
{
tempVec[tempPos++] = vec[leftPos++];
}
else
tempVec[tempPos++] = vec[rightPos++];
}
// 只剩一个序列时,直接复制到临时数组
while (leftPos <= leftEnd)
{
tempVec[tempPos++] = vec[leftPos++];
}
while (rightPos <= rightEnd)
{
tempVec[tempPos++] = vec[rightPos++];
}
//将临时数组的值复制回源数组
int i = 0;
for (; i< numElements; i++, rightEnd--) //这里从后向前复制,因为前面有很多垃圾数据
{
vec[rightEnd] = tempVec[rightEnd];
}
}