(含动画演示)搞懂归并排序 一学就会

91 阅读1分钟

归并排序

=======================================================================

归并排序与快排一样也属于分治算法,但是分治的方法不一样。

总结下来即三步:

  1. 分成子问题
  1. 递归处理子问题
  1. 子问题合并

代码的具体实现:


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];

}

动画演示


请添加图片描述 在这里插入图片描述 在这里插入图片描述## 标题