归并排序(merge sort) 是利用
归并
的思想实现的排序算法,该算法采用经典的分治(divide-and-conquer)
策略。分治法将问题
分(divide)
成一些小的问题然后递归求解,而治(conquer)
的阶段则将分的阶段得到的答案修补
在一起,即分而治之。
?先把这个要排序的数组划分为两份,然后再把子数组再次二分,直到数组的大小为1;然后从低端开始向上合并,合并的过程对每一个子数组进行排序。
其中最重要的就是第三步:归并
归并的过程:
void merge_sort(int q[], int l, int r){
if(l >= r) return; //递归边界
int mid = l + r >> 1; //确定分界点mid
merge_sort(q, l, mid); //递归处理左序列
merge_sort(q, mid + 1, r); //递归处理右序列
int temp[r - l + 1]; //临时数组
int i = l, j = mid + 1, k = 0; //左右指针初始的位置
while(i <= mid && j <= r){ //归并合二为一
if(q[i] <= q[j]) temp[k ++] = q[i ++];
else temp[k ++] = q[j ++];
}
//退出循环的两种情况:左半边走完 或 右半边走完
while(i <= mid) temp[k ++] = q[i ++]; //将左边剩余元素填充进temp数组中
while(j <= r) temp[k ++] = q[j++]; //将右边元素填充进temp数组中 这两个while语句 只会执行其中一个
for(int i = l, j = 0; i <= r; i ++, j ++) q[i] = temp[j]; //将temp数组拷贝到原数组中
}
原文:https://www.cnblogs.com/keyongkang/p/15136895.html