/*排序算法----归并排序(常见版)*/
//算法思想:用一个等大备用空间做辅助,将左边部分与右边部分遍历比较大小,小的填进原数组,不管哪边剩下来的直接填进原数组
#include<iostream>
using namespace std;
template<typename T>
/*泛型编程改进;注意这句话要写在函数的前面*/
void mergesort(T a[],int left,int mid,int right)
{
int k=0;
int i,j,s;
int b[10]={
0};
for(s=left;s<=right;s++)
b[s]=a[s];//b[]数组表面是一个与a[]相同的数组,其实质b[]数组就是被分成了l---m,m---r两段
for(i=left,j=mid+1,k=left;i<=mid&&j<=right;k++)
{
if(b[i]<=b[j]) a[k]=b[i++];
else a[k]=b[j++];
}
/*按照正常情况,这里的for循环做完后,一定会有一侧的顺序已将排列好*/
while(i<=mid)a[k++]=b[i++];
//考虑等于是因为相等是时,i刚好遍历到最后一个数停下了
/*这里的等于符号考虑是为了保证某一侧出现有两个相等的数据排在后面的*/
//发现第一个表的里面存在没有检索完毕的,只需将第一个表中的剩元素全部装进a[]中即可
while(j<=right)a[k++]=b[j++];
/*这里的等于符号考虑是为了保证某一侧出现有两个相等的数据排在后面的*/
//发现第二个表的里面存在没有检索完毕的,只需将第二个表中的剩元素全部装进a[]中即可
}
template<typename T>
void
排序算法-----归并排序(及小改进)
最新推荐文章于 2020-07-07 12:09:19 发布