【C语言-利用合并排序算法对一个具有n个整数元素的数组进行排序】

时间:2025-04-18 16:52:45

【问题描述】

利用合并排序算法对一个具有n个整数元素的数组进行排序;(n<100)

【输入形式】

输入两行,第一行为一个整数n,第二行为n个数组元素,n个元素中间用空格隔开。

【输出形式】

输出一行,排好序的数组(元素之间用一个空格隔开)。

【样例输入】

8

8 9 0 1 2 5 4 3

【样例输出】

0 1 2 3 4 5 8 9

【代码展示】

#include  <stdio.h>
#include  <stdlib.h>
#include  <math.h>
void  Merge(int  B[],int  C[],int  A[],int  p,int  q)
{
    int i=0,j=0,k=0;
    while(i<p&&j<q)  //两个子序列首元素做比较,小者取出置入父序列
    {
        if(C[i]<=A[j])
            B[k++]=C[i++];
        else
            B[k++]=A[j++];
    }
    while(i<p)       //将左半部分剩余元素置入父序列
    {
        B[k++]=C[i++];
    }
    while(j<q)       //将右半部分剩余元素置入父序列
    {
        B[k++]=A[j++];
    }
}
void  Mergesort(int  A[],int  n)
{
        int  i,j;
        if(n>1)
        {
            int  B[100];  //左半部分 
            int  C[100];  //右半部分 
            int  mid=n/2;
            for(i=0;i<mid;i++)
           		B[i]=A[i];       //建立临时数组存储左半部分序列
        	for(j=mid;j<n;j++)
            	C[j-mid]=A[j];   //建立临时数组存储右半部分序列
            Mergesort(B,mid);    //调用自身对左半部分进行合并排序
        	Mergesort(C,n-mid);  //调用自身对右半部分进行合并排序
            Merge(A,B,C,mid,n-mid);
        }
}
int  main()
{
        int  i,n;
        int  a[100];
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
                scanf("%d",&a[i]);
        }
        Mergesort(a,n);
        for(i=0;  i<n;  i++)
        {
                printf("%d ",a[i]);
        }
        return  0;
}
8
8 9 0 1 2 5 4 3
0 1 2 3 4 5 8 9