归并排序

来源:互联网 发布:淘宝假链接是如何制作 编辑:程序博客网 时间:2024/06/03 03:57
#include<cstring>
#include<cstdio>
#include<algorithm>
#include <iostream>
#include<queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
const int inf = 0x3f3f3f3f;
const int MAXN=1005;
const int mod = 10007;
typedef long long LL;
using namespace std;
void mergearray(int a[], int first, int mid, int last, int temp[])//数组合并
{
    int i = first, j = mid + 1;
    int m = mid,   n = last;
    int k = 0;
    while (i <= m && j <= n)
    {
        if (a[i] <= a[j])
            temp[k++] = a[i++];
        else
            temp[k++] = a[j++];
    }
    while (i <= m)
        temp[k++] = a[i++];
    while (j <= n)
        temp[k++] = a[j++];
    for (i = 0; i < k; i++)
        a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])//排序
{
    if (first < last)
    {
        int mid = (first + last) / 2;
        mergesort(a, first, mid, temp);    //左边有序
        mergesort(a, mid + 1, last, temp); //右边有序
        mergearray(a, first, mid, last, temp); //再将二个有序数列合并
    }
}
bool MergeSort(int a[], int n)
{
    int *p = new int[n];
    if (p == NULL)
        return false;
    mergesort(a, 0, n - 1, p);
    delete[] p;
    return true;
}
int main()
{
    int n, a[1005];
    scanf("%d", &n);
    for(int i=0;i<n;++i)
        scanf("%d", &a[i]);
    if(MergeSort(a, n))
    {
        for(int i=0;i<n;++i)
            printf("%d ", a[i]);
    }
    return 0;
}
0 0
原创粉丝点击