归并顺序
归并排序:简单来说就是将一个数组分为二分很多个小区间,然后这些小区间合并起来,就会达到排序的过程;
例如:
int q[4]={3,1,4,2};
-
然后(3,1)为一组,(4,2)为一组;将这两个小区间分别排序,(1,3),(2,4)。
-
分别从两个小区间第一个开始,左1小于右1,将左1放到第一个数组。
-
然后右1不动,和左2进行比较,左2小于右1,将左2放到数组。
-
之后再将右边的数组依次全部放到数组中(因为右边的已经排好了序);
归并模板:
int q[N],temp[N];//需要一个临时数组
void merge_sort(int q[],int l,int r)
{
if(l >= r) return;
int mid = l + r >> 1;
merge_sort(q,l,mid);
merge_sort(q,mid+1,r);
int k = 0,i =l ,j = mid + 1;
while(i <= mid && j <= r)
{
if(q[i] >= q[j])
temp[k++] = q[j++];
else
temp[k++] = q[i++];
}
//将剩余元素都放到数组中
//由于不确定那边剩余,所以都要放一下
while(i <= mid)
temp[k++] = q[i++];
while(j <= r)
temp[k++] = q[j++];
//下面这一步是最重要的!!!!
for(i=l,j=0;i<=r;i++,j++)
q[i]=temp[j];
//根据i和j的值在临时数组中的排好序的小区间依次放到原数组
}