C++数据结构-归并排序

#include <iostream>
#include <cstdlib>
#include <ctime>
#define N 12
using namespace std;

/**
*46,74,16,53,14,26,40,53,86,65,27,34从小到大排序
*归并排序
*/
int B[N+1];//中转数组,存储分块后的值
/**********************合并算法*************************/
//将有序表A[low,mid]和A[mid+,high]合并到B中
void Merge(int *A,int low,int mid ,int high)
{
    for(int i = low;i<=high;i++)
        B[i]=A[i];   //把上次的结果复制到B中,然后进行排序
    int i=low;       //A中元素的下标
    int j=mid+1;     //A中元素的下标
    int k=low;       //B中元素的下标
    while(i<=mid && j<=high)
    {
        if(B[i]<B[j])
            A[k++] = B[i++];
        else
            A[k++] = B[j++];
    }
    while(i<=mid)
         A[k++] = B[i++];
    while(j<=high)
         A[k++] = B[j++];
}

/***********************************************/
//给定区间的归并算法
void Msort(int *A ,int low,int high)
{
    if(low<high)
    {
        int mid = (low + high)/2; //将当前序列A一分为2,求出分裂点mid
        Msort(A,low,mid);   //对子序列A[low,mid]进行递归归并排序,结果还是存在A中
        Msort(A,mid+1,high);//对子序列A[mid+1,high]进行递归归并排序,结果还是存在A中
        Merge(A,low,mid,high);
    }
}
int main()
{
    //初始化
    int nums[N+1]={0,46,74,16,53,14,26,40,53,86,65,27,34};
    //归并排序
    Msort(nums,1,N);
    //打印结果
    for(int i=1;i<=N;i++)
        cout<<nums[i]<<"  ";
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43323201/article/details/84836012