1.题目
设计合并排序算法实现对N个整数排序
2.设计思路
先将无序序列利用分治法划分为子序列,直至每个子序列只有一个元素,然后再对有序子序列逐步进行合并排序。合并方法是循环的将两个有序子序列当前的首元素进行比较,较小的元素取出,置入合并序列的左边空置位,直至其中一个子序列的最后一个元素置入合并序列中。最后将另一个子序列的剩余元素按顺序逐个置入合并序列尾部即可完成排序。
3.源代码
#include<stdio.h>
#define MAX 100
int B[MAX];
int Merge(int A[],int n)
{int mid,s1,s2,i,b;mid=n/2;s1=0;s2=mid;b=0;while(s1<mid&&s2<n)if(A[s1]<=A[s2])B[b++]=A[s1++]; //如果首元素值小于等于中间值就把该值赋到B集合内elseB[b++]=A[s2++]; //否则就把中间值赋给B集合if(s1<mid)for(i=s1;i<mid;i++) //从0到n/2开始循环B[b++]=A[i];elsefor(i=s2;i<n;i++)B[b++]=A[i];for(i=0;i<n;i++)A[i]=B[i];return 1;
}
int MergeSort(int A[],int n)
{if(n<=1)return 1; //如果n等于0或1则无法排序返回主调函数else{MergeSort(A,n/2);MergeSort(A+n/2,n-n/2);Merge(A,n);return 1;}
}int main()
{int a[1000],n,i;scanf("%d",&n); //所输入的元素个数for(i=0;i<n;i++){scanf("%d",&a[i]); //输入元素 }MergeSort(a,n); //对所输入的元素进行排序for(i=0;i<n;i++){printf("%d ",B[i]); }return 0;
}
4.运行结果分析
输入元素个数:8
输入要排序的数组:67 44 6 98 23 21 45 66
排好序的数组:6 21 23 44 45 66 67 98