算法分析——分治思想之合并排序

来源:互联网 发布:编程语言历史发展 编辑:程序博客网 时间:2024/05/22 17:37

根据分治策略,我们创建了合并排序算法,合并排序算法的基本思想是:将待排序元素分成大小大致相同的两个子集合分别对两

个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。

换句话说,将一个数组两个两个结合并排序,形成小范围有序的新的数组,再将新的数组四个四个结合,在此形成新的数组以此

类推,最终实现整个数组的有序。

实现该算法时,首先应该顾名思义,先合并在排序,故当思考时,我们应该将该问题划分为两个子函数——合并函数以及排序函

数。首先,我们先考虑如何实现合并这一函数,根据算法的思想,将待排序元素分成大小大致相同的两个子集,故此,我们应该

考虑以下几点:

1、如何将一个有序的数组分成两个大小大致相同的子集。

2、如何保存分好的数组

于是在创建函数时,我们首先引入一个变量s作为控制分组的变量来解决第一小点,然后我们在原有数组a的基础上引入一个新的数组b

通过数组a,b两个数组的循环使用来保存分好的数组成功解决第二小点

之后我们便可以开始创建合并排序算法

#include<iostream>using namespace std;//合并排序算法 void mergeSort(int a[]){int b[]=new int[strlen(a)];int s=1;//通过s来控制每次分组的大小 while(s<strlen(a))//当s的大小等于数组长度时即代表排序结束 {mergePass(a,b,s);//循环利用数组a,b来保持新排序好的数组 s+=s;mergePass(b,a,s);s+=s;} } //合并方法  void mergePass(int a[],int b[],int s) { for(int i=0;i<strlen(a)-2*s;i+2*s)//i控制分组的循环,当剩余的元素不足以进行下次两两合并时,循环结束  { merge(a,b,i,i+s-1,i+2*s-1);//排序(通过直接传递数组下标,便捷后面的多于处理中的排序)  } if(s>strlen(a))//处理多余的数组元素 ,当多余元素大于一个分组时  { merge(a,b,i,i+s-1,i+strlen(a)-1); } else//当多余数组少于一个分组时 for(int j=i;j<strlen(a);j++) { b[j]=a[j];  }  }

作为合并的方法后,我们得到了两个两个一组的未排序的数组,于是我们通过一个简单对比较排序即可得到排序好的新的结合在一起的数组

void merge(int a[],int b[],int l,int m,int n) {int i=m;int j=m+1;int k=l;while((i<=m)&&(j<=n)){if(a[i]<=c[j]){b[k++]=a[i++];elseb[k++]=a[j++];}}if(i>m){for(int q=j;q<=n;q++){d[k++]=c[q];}}else{for(int q=i;q<=m;q++){d[k++]=c[q];}}  }