vlambda博客
学习文章列表

常用算法模板 | 归并排序



为信竞同学整理的常用算法模板



归并排序 



 1void merge_sort(int q[], int l, int r){
2    //如果只有一个元素,则递归终止
3    if (l == r) return;                       
4
5    //选取中点,将数组二分
6    int mid = l + r >> 1;                     
7    //将左侧数组排序
8    merge_sort(q, l, mid);                    
9    //将右侧数组排序
10    merge_sort(q, mid + 1, r);                
11
12    //i,j双指针
13    int k = l, i = l, j = mid + 1;            
14    //归并数组
15    while (i <= mid && j <= r){               
16        //“<=”保证稳定排序
17        if (q[i] <= q[j]) tmp[k++] = q[i++];  
18        else tmp[k++] = q[j++];
19    }
20
21    //左侧还有剩余元素
22    while (i <= mid) tmp[k++] = q[i++];       
23    //右侧还有剩余元素
24    while (j <= r) tmp[k++] = q[j++];         
25
26    for (int i = l;i <= r; i++) q[i] = tmp[i];
27}

时间复杂度:O(nlogn)
空间复杂度:O(N),需要一个与原数组相同长度的数组做辅助
稳定性:归并排序是稳定的排序算法