归并排序

来源:互联网 发布:dx 1vb大屏幕显示器 编辑:程序博客网 时间:2024/06/05 05:49

考察分而治之的思想,将一个大问题分解成子问题,子问题同时可以用同样的办法继续划分。这样的问题往往使用递归,使得代码非常简洁。

先不看代码,思考如果让一个数列有序,我们可以在某一个位置将数列切分两半。然后,假设我们能将切割线左边有序(注意:这里只有与整体要解决的问题一致才能是分治思想,既我整体要解决有序,那么我在考虑分治的时候,子问题也要考虑在有序的基础上),切割线右边也有序,将两个有序数列合并即可(非常基础)。然后左边的子区域依然可以继续划分左右两半部分使用相同的方法,最终递归下去。


#include<iostream>

#include<stdio.h>
#define MaxRange 100
using namespace std ;
int arr[MaxRange];
int n;
//归并排序
void unit(int a[],int first,int mid,int end)
{
    int tem[MaxRange];
    int counter=0,i=first,j=mid;
    while(i<mid&&j<end)
    {
        if(a[i]>a[j])
            tem[counter++] = a[j++];
        else
            tem[counter++] = a[i++];
    }
    while(i<mid)
        tem[counter++] = a[i++];
    while(j<end)
        tem[counter++] = a[j++];
    j=0;
    for(int i=first;i<counter+first;i++)
        a[i] = tem[j++];
}
void unitSort(int first,int end)
{
    //first的意义从first开始,到end结束,但end是个数,从零开始到end-1有数
    if(first<end-1)//此处用最小的排序测试first=0,end=1时证明数组个数为1无需做
        //first = 0,end = 2时才需要做下面的运算故可以得到相差2在做运算
    {
        int mid = (first+end)/2;
        unitSort(first,mid);//(1)左侧做完归并排序,
        unitSort(mid,end);//(2) 右侧做完归并排序
        unit(arr,first,mid,end);  //将两个有序数组合并
    }
}
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    scanf("%d",&arr[i]);
    unitSort(0,n);//(3)  (1)(2)(3)处的参数含义应该保持一致
    for(int i=0;i<n;i++)
        printf("%d",arr[i]);
}
原创粉丝点击