归并排序

来源:互联网 发布:将java类传到jsp里面 编辑:程序博客网 时间:2024/06/05 11:33

归并操作  归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。

  如 设有数列{6,202,100,301,38,8,1}

  初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数

  i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3

  i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4

  i=3 [ 1 6 8 38 100 202 301 ] 4

  总计: 11次

  归并操作的工作原理如下:

  申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

  设定两个指针,最初位置分别为两个已经排序序列的起始位置

  比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

  重复步骤3直到某一指针达到序列尾

  将另一序列剩下的所有元素直接复制到合并序列尾

A[0]A[1]A[2]A[3]A[4]A[5] 49386597761327

 

#include <iostream>
#define MAX 1010
using namespace std;
void mergesort(int a[],int first,int mid,int last)
{
    int i = first,j = mid + 1,p = 0;
    int b[MAX];
    while(i <= mid && j <= last)
    {
        if(a[i] < a[j])
        {
            b[p++] = a[i++];
        }
        else
        {
            b[p++] = a[j++];
        }
    }
    while(i <= mid)b[p++] = a[i++];
    while(j <= last)b[p++] = a[j++];
    for(i = 0; i < p; i++)
    {
        a[i + first] = b[i];
    }
}
void merge(int a[],int first,int last)
{
    if(first >= last)return;
    int mid = first + last;
    merge(a,first,mid);
    merge(a,mid + 1, last);
    mergesort(a,first,mid,last);
}
int main()
{
    int n,m;
    int i,j;
    cin>>n;
    int a[MAX];
    while(n--)
    {
        cin>>m;
        i = 0;
        while(m--)
        {
            cin>>a[i];
            i++;
        }
        merge(a,0,m-1);
        for(j = 0; j < m; j++)
        {
            cout<<a[j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}