合并排序(分治法)

简介

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

1、分

对集合不断进行拆分,直至集合中只剩一个元素为止。

void Mergesort(int left,int right)
{
if(left<right)
{
int mid=(left+right)/2;
Mergesort(left,mid);
Mergesort(mid+1,right);
Merge(left,right);
}
}

2、治(合并相邻有序子序列)

调用合并排序算法,将每一个子集合的元素进行排序,并将排序后的结果保存在临时数组中,再将临时数组赋值给初始数组即可
在这里插入图片描述

void Merge(int left,int right)
{
int mid=(left+right)/2;
int i=left;
int j=mid+1;
int t=0;
while(i<=mid&&j<=right)
{
if(a[i]<=a[j])temp[t++]=a[i++];
else temp[t++]=a[j++];
}
while(i<=mid)temp[t++]=a[i++];//将左边剩余元素填充进temp中
while(j<=right)temp[t++]=a[j++];//将右序列剩余元素填充进temp中
    t=0;
// cout<<"xwhdewjdb"<<endl;
//将temp中的元素全部拷贝到原数组中
while(left<=right)
{
// cout<<a[left]<<"  ";
        a[left++]=temp[t++];
}
// cout<<"加速度快的---------------"<<endl;
}

完整代码:

#include<bits/stdc++.h> 
using namespace std; 
int temp[1005],a[1005];//临时数组
void Merge(int left,int right)
{
    int mid=(left+right)/2;
    int i=left;
    int j=mid+1;
    int t=0;
    while(i<=mid&&j<=right)
    {
        if(a[i]<=a[j])temp[t++]=a[i++];
        else temp[t++]=a[j++];
    }
    while(i<=mid)temp[t++]=a[i++];//将左边剩余元素填充进temp中
    while(j<=right)temp[t++]=a[j++];//将右序列剩余元素填充进temp中
    t=0;
   // cout<<"xwhdewjdb"<<endl;
    //将temp中的元素全部拷贝到原数组中
    while(left<=right)
    {
       // cout<<a[left]<<"  ";
        a[left++]=temp[t++];
    }
   // cout<<"加速度快的---------------"<<endl;
}
void Mergesort(int left,int right)
{
    if(left<right)
    {
        int mid=(left+right)/2;
        Mergesort(left,mid);
        Mergesort(mid+1,right);
        Merge(left,right);
    }
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    Mergesort(0,n-1);
    int flag=0;
    for(int i=0;i<n;i++)
    {
        if(i==n-1)
        {
            cout<<a[i]<<endl;
            continue;
        }
        if((i+1)%10==0)cout<<a[i]<<endl;
        else cout<<a[i]<<' ';
    }
}


版权声明:本文为LX333XL原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。