算法思路:
初始条件:
if n<2 return;(只有一个元素的情况下是有序的)
状态条件:
leftsort();
rightsort();
merge();
思路及分解,解决,合并;
//递归分解
void
SortNum(
int
*NumArray,
int
left,
int
right)
{
if (left<right)
{
if (left<right)
//left<right 说明n>=2
{
{
//对左右取均值
int middle=(left+right)/ 2 ;
int middle=(left+right)/ 2 ;
//以均值为为分界点,继续对问题的规模进行2分,直到分到只剩1个元素
//左分
SortNum (NumArray, left, middle);
SortNum (NumArray, left, middle);
//右分
SortNum (NumArray, middle+ 1 , right);
SortNum (NumArray, middle+ 1 , right);
//对每一个已经分好返回的模块进行并归并;
MergeNum (NumArray, left, middle, right);
}
}
//归并算法
void MergeNum( int *MNumArray, int left, int right, int middle)
{
//n1为左边部分元素的个数;
MergeNum (NumArray, left, middle, right);
}
}
//归并算法
void MergeNum( int *MNumArray, int left, int right, int middle)
{
//n1为左边部分元素的个数;
int
n1=middle-left+
1
;
//n2为右边部分元素的个数
int n2=right-middle;
int n2=right-middle;
//创建左边元素的临时存储数组
int *ArrLeft= new int [n1+ 1 ];
int *ArrLeft= new int [n1+ 1 ];
//创建 右边元素的临时存储数组
int *ArrRight= new int [n2+ 1 ];
int *ArrRight= new int [n2+ 1 ];
//左边临时元素存储数组获取目标数组待排序区间的左边元素;
for ( int i= 0 ; i<n1; i++)
ArrLeft[i]=MNumArray[left+i- 1 ];
for ( int i= 0 ; i<n1; i++)
ArrLeft[i]=MNumArray[left+i- 1 ];
//右边临时元素存储数组获取目标数组待排序区间的右边元素;
for ( int j= 0 ; j<n2; j++)
ArrRight[j]=MNumArray[middle+j];
for ( int j= 0 ; j<n2; j++)
ArrRight[j]=MNumArray[middle+j];
//对元素设置标志位(不完善,无法处理元素中包含INT_MAX的排序目标)
ArrRight[n1]= INT_MAX ;
ArrLeft[n2]= INT_MAX ;
int i= 0 ;
int j= 0 ;
ArrRight[n1]= INT_MAX ;
ArrLeft[n2]= INT_MAX ;
int i= 0 ;
int j= 0 ;
//对左右的有序数组进行归并,此部分模块有序化;
for ( int k=left- 1 ; k<right; k++)
{
if (ArrLeft[i]<ArrRight[j])
{
MNumArray[k]=ArrLeft[i];
i++;
}
else
{
MNumArray[k]=ArrRight[j];
j++;
}
}
for ( int k=left- 1 ; k<right; k++)
{
if (ArrLeft[i]<ArrRight[j])
{
MNumArray[k]=ArrLeft[i];
i++;
}
else
{
MNumArray[k]=ArrRight[j];
j++;
}
}
//释放临时数组内存
delete [] ArrRight;
delete [] ArrLeft;
}
delete [] ArrLeft;
}