归并排序
归并排序与快排一样也属于分治算法,但是分治的方法不一样。
总结下来即三步:
- 分成子问题
- 递归处理子问题
- 子问题合并
代码的具体实现:
void merge_sort(int q[],int l,int r){
//1.分成子问题
if(l>=r) return;//递归结束条件。
int mid = l + r >>1;//( >> 1 <=> / 2 )
//2.递归处理子问题
merge_sort(q,l,mid),merge_sort(q,mid+1,r);//将左右两堆排好序。
//使用一个额外的等长的数组(tmp数组)来接收;两堆中较小的那个数字。
// => 达到排序的目的
//3.子问题合并
int k = 0,i = l,j = mid + 1;
while(i<=mid && j<=r)
if(q[i]<=q[j]) tmp[k++] = q[i++];
else tmp[k++] = q[j++];
//如果两堆还剩下数,直接全部装到临时数组后面。(左边那堆先装)=> 确保了归并排序的稳定性
while(i<=mid) tmp[k++] = q[i++];
while(j<=r) tmp[k++] = q[j++];
//排好序的数字归位。
for(i=l,j=0;i<=r;i++,j++) q[i] = tmp[j];
}
动画演示
## 标题