最近正在学习各种排序算法,今天实现了归并排序。先上代码:
#include "stdafx.h"
#include <iostream>
template<typename T>
void Merge(T A[],const int& p,const int& q,const int& r) // p表示开始排序的位置,q是结束位置,r是断
点
{
T *A_array_help = new T[r - p + 1]; //A_array_help,B_array_help是用来存储分割后的序列
for(int i = 0;i < r - p + 1;i ++)
{
A_array_help[i] = A[p + i];
}
//print<T>(b,5);
T *B_array_help = new T[q - r];
for(int i = 0;i < q - r;i ++)
{
B_array_help[i] = A[r + i + 1];
}
//print<T>(c,5);
int A_array_order = 0;
int B_array_order = 0;
for(int i = p;i <= q;i ++)
{
if(A_array_order < r - p + 1 && B_array_order < q - r)
{
if(A_array_help[A_array_order] < B_array_help[B_array_order])
A[i] = A_array_help[A_array_order ++];
else
A[ i] = B_array_help[B_array_order ++];
}
else
{
if(A_array_order < r - p + 1)
A[i] = A_array_help[A_array_order ++];
else
A[i] = B_array_help[B_array_order ++];
}
}
delete [] A_array_help;
delete [] B_array_help;
}
template<typename T>
void Merge_Sort(T A[],int p,int q)
//算法主体,实现分割和合并。
{
if(p < q)
{
int r = (p + q) / 2;
Merge_Sort(A,p,r);
Merge_Sort(A,r+1,q);
Merge(A,p,q,r);
}
}
template<typename T>
void print(T array_pointer[],const int& array_size)
{
for(int i = 0;i < array_size;i ++)
{
std::cout << array_pointer[i] << std::endl;
}
}
其原理很简单:将原数组一分为二,然后将有序数组归并,如此递归下去。代码已经写过测试用例测试过。忘大家指正