归并排序是很有意思的排序,将已有序的序列合并,从而得到完全一样的序列,即先使子序列有序再进行合并。 对于一个数组,左边left,右边right,我们取中点値mid,以此为基点进行分割,此过程可以使用递归来实现。 分割完毕后进行合并。 
 在经历分割之后,开始排序并合并。  
void Bsort(int* arr, int left, int right, int* tmp)
{
if (left >= right)
{
return;
}
int mid = (left + right) / 2;
Bsort(arr, left, mid, tmp);
Bsort(arr, mid + 1, right, tmp);
int begin1 = left, end1 = mid;
int begin2 = mid + 1, end2 = right;
int i = left;
while (begin1 <= end1 && begin2 <= end2)
{
if (arr[begin1] < arr[begin2])
{
tmp[i++] = arr[begin1++];
}
else
{
tmp[i++] = arr[begin2++];
}
}
while (begin1 <= end1)
{
tmp[i++] = arr[begin1++];
}
while (begin2 <= end2)
{
tmp[i++] = arr[begin2++];
}
for (i = left; i <= right; i++)
{
arr[i] = tmp[i];
}
}
void Sort(int* arr, int left, int right)
{
int len = right - 1;
int* tmp;
tmp = (int*)malloc(sizeof(int) * right);
Bsort(arr, left, len, tmp);
free(tmp);
}
|