归并排序

跳转地址

归并排序的重点是合并,利用双指针算法,排序的是否稳定是指如果两个数的大小相同,在经过排序后相对位置不变,那么这个排序就是稳定的,否则就是不稳定的

归并排序的思路是将数组按照mid分开成为两部分,然后先进行递归再排序,排序时按照双指针算法进行排序,用temp存放结果最后将temp中的结果赋值给排序数组,用于后续递归操作,具体思路写在代码注释里面了

#include <iostream>
using namespace std;
const int N =100010;
int q[N], tmp[N];
void merge_sort(int q[], int l, int r)
{
    if(l >= r) return ;
    else
    {
        int mid = l + r >>1;
        merge_sort(q, l, mid);
        merge_sort(q, mid + 1, r);
        int i = l, j = mid + 1, k = 0;
        //双指针合并操作,两个部分都是有序的
        while(i <= mid && j <= r)
        {
            if(q[i] <= q[j]) tmp[k ++] = q[i ++];//选取两部分中较小的放进temp中去
            else tmp[k ++] = q[j ++];
        }
        //下面两部分最多只有一部分会执行,也就是说最后剩下的那个部分就是最大的了
        while(i <= mid) tmp[k ++] = q[i ++];
        while(j <= r) tmp[k ++] = q[j ++];
        //最后将temp数组里的值反向赋值回q中去
        for(i = l, j = 0; i <= r; j ++,i ++) q[i] = tmp[j];
    }
}
int main()
{
    int n;
    scanf("%d", &n);
    for(int i = 0;i<n;i++) scanf("%d",&q[i]);
    merge_sort(q,0,n-1);
    for(int i = 0;i<n;i++) printf("%d ",q[i]);
    return 0;
}
posted @ 2022-07-11 16:11  LYL233  阅读(34)  评论(0)    收藏  举报