//归并排序算法
vector<int> merge_sort( vector<int>& arr )
{
int m = arr.size();
if( m<2 ) return arr;
int pivot = m/2;
/*以下空间是归并排序的重点*/
/*高效算法是以空间换时间的,而归并算法所需要的空间即:
存储排好序后的数组ans,存储左侧元素的数组left,存储右侧元素的数组right*/
vector<int> left; vector<int> right;
//std::copy( arr.begin(),arr.begin()+pivot,left.begin() ); //注意指定内存地址,没有初始分配空间时,会溢出,因为是定义为vector<int> left,没有分配空间
//std::copy( arr.begin()+pivot, arr.end(), right.begin() );
for( int i=0; i<pivot; ++i ) left.push_back( arr[i] );
for( int i=pivot; i<m; ++i ) right.push_back( arr[i] );
left = merge_sort( left ); //深度优先遍历
right = merge_sort( right );
/*ans存储中间排好序的结果并返回*/
vector<int> ans;
std::vector<int>::iterator l = left.begin();
std::vector<int>::iterator r = right.begin();
while( l!=left.end() || r!=right.end() ) //注意条件判断的完整性
{
//if( l==left.end() || *l>*r ) { ans.push_back( *r );++r; }//该条件判断不完整,当r为空时,内存溢出,因此要先判断内存是否为空
if( l==left.end() ) { ans.push_back( *r );++r; }
else if( r==right.end() ) { ans.push_back( *l );++l; }
else if( *l>*r ) { ans.push_back( *r );++r; }
else if( *l<*r ) { ans.push_back(*l);++l; }
else if( *l==*r ) { ans.push_back(*l); ans.push_back(*r); ++l; ++r; }
}
return ans; //返回排序好的数组
}