核心思想:将多个有序数组进行合并变成一个有序的
1.获得中间位置mid
2.左 起始~mid
右 mid+1~结束
3.合并(合并两个有序数组,方法有点像合并两个有序链表)
void hebing(int *arr,int begin,int end) {
//获取中间值
int mid = (begin + end) / 2;
//申请一个与数组长度相同的新数组
int* newarr = (int *)malloc(sizeof(int) * (end - begin + 1));
//左半部分起始是begin,结束是mid
int left = begin;
//左半部分起始是mid+1,结束是end
int right = mid + 1;
//标记下一次插入到新数组的位置
int index = 0;
//循环比较左半部分和右半部分谁小谁插入到新数组,知道一边已经走完
while (right <= end && left <= mid) {
if (arr[right] < arr[left]) newarr[index++] = arr[right++];
else newarr[index++] = arr[left++];
}
//把没有走完的一边的剩余的元素放入到数组中
while (left <= mid)
{
newarr[index++] = arr[left++];
}
while (right <= end)
{
newarr[index++] = arr[right++];
}
//这里index--是因为每次插入后都会index++
//最后一次插入后index就不需要++了要把多加的减回来
index--;
//再把插入到新数组的值插入回原数组
while (index >= 0) {
arr[begin+index] = newarr[index];
index--;
}
//释放申请的新数组
free(newarr);
newarr = NULL;
}
//归并排序
void guibingSort(int* arr, int begin, int end) {
//获得中间值
int mid = (begin + end) / 2;
//起始和结束相同时说明就剩一个元素,有序了,返回
if (begin == end) {
return;
}
guibingSort(arr, begin, mid);//处理左半部分
guibingSort(arr, mid+1, end);//处理右半部分
hebing(arr, begin, end);//两边处理完都有序了就合并
}