归并排序模板

57 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

算法思想:分治 时间复杂度:O(nlogn)

第一步:选取中点,将一段要排序的数字分为两段,然后分别对两段排序(因为分治,所以可以保证这两段都是有序的)

第二步:用两个指针分别扫描这两段,每次把最小的一个数放入一个临时数组里,直到某一段放完,然后把剩下一段全部放入临时数组即可

第三步:把临时数组里的数放到原数组里

void merge_sort(int q[],int l,int r)
{
    if(l>=r) return;
  
    int mid = l+r >>1; //二进制右移一位 相当于(l+r)/2

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