归并排序------(分治+递归)

在这里插入图片描述

  1. 确定分界点, m i d = ( l + r ) / 2 mid = (l + r)/2
  2. 递归排序 l e f t , r i g h t left,right
  3. 归并------合二为一
    先把左边排好序,再把右边排好序,然两者合二为一

在这里插入图片描述
C++代码

#include <iostream>

using namespace std;

const int N = 1e5+10;

int n;
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;  //k记录temp数组走到哪了,i,j分别指向最左端和中间
    while (i <= mid && j <= r){  //判断i,j是否小于左半边的边界和右半边的边界
        if(q[i] <= q[j])  //比较两个指针所指向的值
            temp[k++] = q[i++];
        else
            temp[k++] = q[j++];
    }
    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];
}

int main(){

    cin >> n;
    for(int i = 0;i < n;i++)
        cin >> q[i];

    merge_sort(q,0,n-1);  //0:数组的最左端,1数组的最右端

    for(int i = 0;i < n;i++)
        cout << q[i] << " ";

    return 0;
}
发布了52 篇原创文章 · 获赞 5 · 访问量 2274

猜你喜欢

转载自blog.csdn.net/advjj_058229/article/details/100063576