- 论坛徽章:
- 0
|
#include <tchar.h>
#include <iostream>
#include <algorithm>
#include <iterator>
//复制函数
//此教程来源于ChinaUnix論壇(http://bbs.chinaunix.net/)查看完整的教程请点:http://bbs.chinaunix.net/thread-1296106-1-1.html
template <typename T>
void copy(T* begin, T* end, T* out)
{
while ( begin!=end )
{
*out=*begin;
++out;
++begin;
}
}
//将两个有序数组合并到一个数组中
template <typename T>
void merge(T* begin1, T* end1, T* begin2, T* end2, T* out)
{
for ( ;; )
{
if ( begin1!=end1 && begin2!=end2 )
{
if ( *begin1<*begin2 )
{
*out=*begin1;
++begin1;
}
else
{
*out=*begin2;
++begin2;
}
}
else if ( begin1!=end1 )
{
*out=*begin1;
++begin1;
}
else if ( begin2!=end2 )
{
*out=*begin2;
++begin2;
}
else
{
break;
}
++out;
}
}
//归并排序
template <typename T>
void MergeSort(T data[], int size)
{
if ( size>1 ) //数组元素要大于两个才有排序的必要
{
//将数组二分
int lsize=size/2;
int rsize=size-lsize;
T* left=new T[lsize];
T* right=new T[rsize];
::copy(data, data+lsize, left);
::copy(data+lsize, data+size, right);
//递归
MergeSort(left, lsize);
MergeSort(right, rsize);
//合并
::merge(left, left+lsize, right, right+rsize, data);
//删除辅助空间
delete[] left;
delete[] right;
}
}
//测试例程
int _tmain(int argc, _TCHAR* argv[])
{
int data[10000];
for ( int i=0; i<10000; ++i )
{
data[i]=rand()%1000;
}
MergeSort(data, 10000);
std::copy(data, data+10000, std::ostream_iterator<int>(std::cout, " "));
return 0;
} |
[ 本帖最后由 langue 于 2008-10-25 08:00 编辑 ] |
|