/*排序算法----归并排序(常见版)*/
//算法思想:用一个等大备用空间做辅助,将左边部分与右边部分遍历比较大小,小的填进原数组,不管哪边剩下来的直接填进原数组
#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
排序算法-----归并排序(及小改进)
最新推荐文章于 2024-09-04 18:39:13 发布
本文深入探讨了归并排序算法的工作原理,并提出了一种小改进以提高其效率。通过理解分治策略,我们详细解释了如何将数组分成两半,然后递归地排序这些部分,最后将它们合并。此外,我们讨论了如何利用已排序的部分来减少比较次数,从而在某些情况下提升性能。这一改进对于大数据集尤其有益,展示了排序算法在实际应用中的灵活性。
摘要由CSDN通过智能技术生成