要将一个序列排序,可以先将他划分为两部分,然后再将结果归并起来
简单来说,归并排序就是使用递归的方法,将序列逐步化小,进行排序后再进行归并
这种排序方法,所需时间与NlogN成正比,但需要的额外空间较多
自顶向下的归并排序
main中调用部分已经省略
template<typename T>
class sort
{
std::vector<T> a;
std::vector<T> aux;
public:
void merge_sort(std::vector<T> &item)
{
aux.resize(item.size());
msort(item,0, aux.size() - 1);
}
private:
bool less(T a,T b)//比较两个变量大小
{
return a < b;
}
void merge(std::vector<T> &a,int low, int mid, int high)
{
int i = low, j = mid + 1;
for (int k = low; k <= high; k++)
{
aux[k] = a[k];
}
for (int k = low; k <= high; k++)
{
if (i > mid) //如果i已经大于mid了则需要将a[K]剩余值赋予a[j]的值,以免溢出增加
a[k] = aux[j++];
else if (j > high) //同理
a[k] = aux[i++];
else if (less(aux[j], aux[i]))//比较
a[k] = aux[j++];
else
a[k] = aux[i++];
}
}
void msort(std::vector<T> &a,int low, int high)
{
if (high <= low)
return;
int mid = low + (high - low) / 2;
msort(a, low, mid);
msort(a, mid+1, high);
merge(a, low, mid, high);
}
运行结果