归并排序
在快速排序中,我们先排序,在递归,但是归并排序并不是这样的
他是先递归,然后再排序,还有它是以一个理想的分开排序,就是
每一次递归都是一半,比快排要稳定,最重要的是你要把他们合并
在一起,这才是算法的关键
你要有两个数组,每次i 从数组的左边搜索,j从数组的中间搜索
当发现a[i]>a[j]的时候,我们就把小的哪一个放到第二个数组里面,
因为是先递归。所以在第一次分开的时候,就是左边和右边都是
序的,所以在搜索的时候,我们可以一边过,当然,我们还需要
加一个数组来记录这一词的结果。代码如下
void merge_sort(int a[],int l,int r)
{
if(l<r) return ;
int mid=l+r>>1;
merge_sort(a,l,mid),merge_sort(a,mid+1,r);
int i=l,j=mid;
while(i<=mid&&j<=r)
{
if(a[i++]>a[j++]) tmp[k++]=a[j];
else tmp[k++]=a[i];
}
while(i<=mid)
tmp[k++]=a[i++];
while(j<=r)
tmp[k++]=a[j++];
for(i=0,j=l;i<r;j++,i++)
a[j]=tmp[i];
}