//归并排序算法
void merger(int arr[], int TempArr[], int left, int mid, int right){
//标记左半部分第一个元素
int l_pos = left;
//标记右半部分第一个元素
int r_pos = mid + 1;
//临时数组下标
int Pos = left;
while(l_pos <= mid && r_pos <= right){
if(arr[l_pos] < arr[r_pos]){ //左半区第一个元素更小
TempArr[Pos++] = arr[l_pos++];
}
else
TempArr[Pos++] = arr[r_pos++]; //右半区第一个元素更小
}
//左半部分剩余的元素
while (l_pos <= mid)
TempArr[Pos++] = arr[l_pos++];
//右半部分剩余的元素
while (r_pos <= right)
TempArr[Pos++] = arr[r_pos++];
//把临时数组拷贝给原数组
while(left <= right){
arr[left] = TempArr[left];
left++;
}
}
void Msort(int arr[], int TempArr[], int left, int right){
//如果只有一个元素时那么就不需要划分
if(left < right){
//中间点
int mid = (left + right) / 2;
//递归划分左半区域
Msort(arr, TempArr, left, mid);
//递归划分有半区域
Msort(arr, TempArr, mid + 1, right);
//合并
merger(arr, TempArr, left, mid, right);
}
}
//归并入口
void Meger_Sort(int arr[],int n)
{
//临时数组
int *TempArr = (int *)malloc(sizeof(int) * n);
if (TempArr){ //分配成功
Msort(arr,TempArr,1,n - 1);
free(TempArr);
}
else{
printf("Error!\n");
}
}