归并排序(原理分治)

纯新人有啥错误的还望大佬指出

1 确定分界点//一般取两端点中点

//以分界点为中心进行递归的话,需要保证分界点位于两端点中所以取值为两端点之和除以2

2 利用递归进行排序

//对左右两边进行递归

//递归的过程 使分化为最小的两个进行排序,实现数组在一定范围内有顺序,从而实现排序

3 合二为一

//将短排序(己排序)合为一个

 

//将一个大问题简化为许多小问题

C++代码:

#include <iostream>using namespace std;
int n;
int q[100100],tmp[100100];
void sort_(int q[],int l,int r)
{
    if(l>=r) return ;
    int mid=(l+r)>>1;
    sort_(q.l,mid),sorr_(q,mid+1,r);//优先进行底层排序,底层排序使产生的数组tmp具有一定顺序
    int i=l,j=mid+1,k=0;
    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++];//防止i没完全传到tmp中
    while(j<=r) tmp[k++]=q[j++];//同上
    for(i=l;i<=r;i++) q[l]=tmp[i-l];
    return ;
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    cin>>q[i];
    sort_(q,0,n);
    for(int i=0;i<n;i++)
    cout<<q[i]<<' ';
    return 0;
}

 

 

posted @ 2021-08-29 18:56  喵喵不嗷唔  阅读(37)  评论(0)    收藏  举报