归并排序

题目链接:AcWing 787. 归并排序

时间复杂度: O(nlogn),归并排序分为logn层,每层的时间复杂度为O(n)
此外,归并排序是稳定的排序。

归并排序的基本步骤:

  1. 选定分界点mid = (l+r)/2;
  2. 递归两个子区间;
  3. (重点)归并,将两个有序数组合二为一。需要一个临时数组用于存放结果,并用双指针找到两个有序数组当前的最小值。

代码实现:

#include 
using namespace std;

const int maxn = 1e5 + 10;
int n, a[maxn], temp[maxn];

void merge_sort(int a[], int l, int r){
      //l,r左右边界
    int mid = l + r >> 1;
    if(l >= r) return;
    
    merge_sort(a, l, mid), merge_sort(a, mid + 1, r);
    
    int k = 0, i = l, j = mid + 1;
    while(i <= mid && j <= r){
       //每次将当前的最小值放入结果数组
        if(a[i] <= a[j]) temp[k++] = a[i++];
        else temp[k++] = a[j++];
    }
    //若一个数组为空,另外一个数组还有剩下,则都放到结果数组中
    while(i <= mid) temp[k++] = a[i++]; 
    while(j <= r) temp[k++] = a[j++];
    
    for(i = l, j = 0; i <= r; i++, j++) a[i] = temp[j];
    
}

int main(){
     
    scanf("%d", &n);
    
    for(int i = 0; i < n; i++ ) scanf("%d", &a[i]);
    merge_sort(a, 0, n-1);
    
    for(int i = 0; i < n; i++ ) printf("%d ", a[i]);
    
    return 0;
}

你可能感兴趣的:(算法学习,排序算法,算法)