在数列排序中,如果只有一个数,那么其本身就是有序的;如果只有两个数,那么一次比较就可以完成排序。可以看出来,数越少,排序越容易。那么,如果有一个由大量数据组成的数列,就很难快速的完成排序。这时就可以考虑将其分解成很小的数列,直到最后只剩一个数为止,这时其本身就是有序的,再把这些有序的数列合并在一起,执行一个和分解相反的过程,从而完成整个数列的排序。
合并排序就是采用分治的策略,将一个大的问题分成很多小的问题,先解决小问题,再通过小问题解决大问题。由于排序问题给定的是一个无序的序列,可以把待排列元素分解成两个规模大致相等的子序列,如果不易解决,再将得到的子序列继续分解,直到子序列中包含的元素个数为1,此时便可以进行合并,从而得到一个完整的有序序列。
大致过程:
(1)将待排列元素分为大小 大致相同的两个子序列
(2)对两个子序列进行合并排列
(3)将排好序的有序子序列进行合并,得到最终的有序序列
合并方法:
设置3个工作指针i,j,k(整数型)和一个辅助数组b[]。其中,i和j分别指向两个待排序子序列中当前待比较的元素,k指向辅助数组b[]中带放置元素的位置。比较a[i]和a[j],将较小的赋值给b[k],同时相应指针向后移动。如此反复,直到所有元素处理完毕。最后把辅助数组B中排好序的元素复制到数组a中。
void merge(int a[],int low,int mid,int high)
{
int *b=new int[high-low+1]; //申请一个辅助数组
int i=low,j=mid+1,k=0;
while(i<=mid&&j<=high) //按从小到大存放到辅助数组b[]中
{
if(a[i]<=a[j])
b[k++]=a[i++];
else
b[k++]=a[j++]