//分
void merge_sort(int * data, int start , int end , int * result)
{
if(1==end - start) //如果区间内只有两个元素 直接对这两元素排序
{
if(data[start]> data[end])
{
data[start] = data[start]^= data[end];
data[end] = data[start]^= data[end];
data[start]= data[start]^= data[end];
}
return;
}
else if (0== end - start) //元素为1 不排序
return;
else
{
merge_sort(data, start , (end-start+1)/2+start , result); //(end-start+1)是元素的总个数
merge_sort(data, (end-start+1)/2+start+1,end,result ); //递归分别把左右子区间排序
merge(data,start,end,result); //把所有排好序的子区间进行归并
for(int i = start;i<=end;i++) //把排序后的result 数据倒回原数组中
{
data[i] = result[i];
}
}
}
void merge( int * data, int start ,int end, int * result)
{
int left_length = (end-start+1)/2+1; //左区间的长度;
int left_index = start;
int right_index = start + left_length; //右区间开始的下标
int result_index = start; //临时数组的下标
while(left_index<right_index&&right_index< end+1)
{
if(data[left_index]> data[right_index])
result[result_index++]=data[right_index++];
else
result[result_index++]=data[left_index++];
}
//跳出循环有两种可能 一是左区间数据已遍历完,二是右区间数据已遍历完,所以要分两种情况把剩余的数据倒入result里
while(left_index<right_index)
result[result_index++] = data[left_index++];
while(right_index<end+1)
result[result_index++] = data[right_index++];
}