当前位置: 首页 > news >正文

石家庄微信网站建设公司用老薛主机做网站

石家庄微信网站建设公司,用老薛主机做网站,建设银行南通城区网站,注册过哪些网站目录 归并排序的递归实现 代码实现 归并排序的非递归实现 代码实现 归并排序的思想很简单——分治法。简单地说,归并排序的是将序列拆分成几段子序列,将每一段子序列分别进行排序,排好之后再将有序的子序列归并(有点像合并两…

目录

归并排序的递归实现 

代码实现

归并排序的非递归实现 

代码实现


归并排序的思想很简单——分治法。简单地说,归并排序的是将序列拆分成几段子序列,将每一段子序列分别进行排序,排好之后再将有序的子序列归并(有点像合并两个有序数组)成为一个有序的序列。

例如要排序数列:10、6、7、1、3、9、4、2;

将序列拆分为 2 个子序列;

继续拆分;

 

 继续拆分;

至此,每个子序列的长度都为 1 ,因为只有一个数,所以可认为是有序序列;

现将子序列两两归并,即合并两个有序序列;

继续归并;

继续归并; 

以上就是归并排序的整个过程,很显然归并排序的实现应该离不开递归的思想。

归并排序的递归实现 

归并排序的递归实现较为简单,需要注意的有两点:

1. 归并的过程并非在原数组上直接改动,而是开辟一个临时数组,在临时数组上进行排序,排好之后将临时数组的内容全部拷贝到原数组;

2. 代码中使用的是二路归并(如上图所示,每次将序列拆分为两个子序列)。

代码实现

void _MergeSort(int* a, int begin, int end, int* tmp)
{//递归的结束条件//当序列只有一个元素时或序列不存在时if (begin >= end)return;//将序列进行拆分 //[begin,mid]  [mid+1,end]int mid = (begin + end) / 2;//拆分的过程_MergeSort(a, begin, mid, tmp);_MergeSort(a, mid+1, end, tmp);//以下为归并的过程int begin1 = begin, end1 = mid;int begin2 = mid+1, end2 = end;int i = begin;//归并:合并两个有序序列while (begin1 <= end1 && begin2 <= end2){if (a[begin1] <= a[begin2]){tmp[i++] = a[begin1++];}else{tmp[i++] = a[begin2++];}}//如果第二段序列先结束while (begin1 <= end1){tmp[i++] = a[begin1++];}//如果第一段序列先结束while (begin2 <= end2){tmp[i++] = a[begin2++];}//将临时数组的数据拷贝回原数组memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}void MergeSort(int* a,int n)
{//开辟一个临时数组int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");exit(-1);}_MergeSort(a, 0, n - 1, tmp);//释放与置空free(tmp);tmp = NULL;
}

归并排序的非递归实现 

非递归与递归作用思想基本相同。递归实现时,因为拆分序列时采用的是递归的方式,所以通过传递参数就可以控制子序列的长度。但是非递归不行,非递归通过变量 rangeN 来控制序列的长度(或间隔),每次让 rangeN *= 2 例如:

但是由于 rangeN 每次都 *2 ,而我们排序的序列长度不可能总是 2 的倍数,所以 可能会有数组越界访问的风险。例如:

现将两个子序列归并,并将数据拷贝回原数组时,就会发生越界:

当然这只是其中一种越界的可能情况——第二段序列发生越界,原因是右边界 end2 大于 n;

实际操作中,一共会有三种情况导致越界:

两段序列的区间分别为: [begin1,end1]  [begin2,end2]

1. end1 > n;

2. begin > n;

3.end2 > n;

所以,当这三种情况发生时,需要修正区间,以上述用例为例, end2 大于 n 时,令 end2 = n-1即可;

代码实现

void MergeSortNonR(int* a, int n)
{//开辟一个临时数组int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");exit(-1);}int rangeN = 1;while (rangeN < n){// i 控制访问子序列的位置for (int i = 0; i < n; i += 2 * rangeN){//拆分为两段子序列//[begin1,end1] [begin2,end2]int begin1 = i, end1 = i + rangeN - 1;int begin2 = i + rangeN, end2 = i + 2 * rangeN - 1;int j = i;//判断是否发生越界的三种情况,如果有,就修正区间if (end1 >= n){end1 = n - 1;//将第二段序列改为不存在的序列即可begin2 = n;end2 = n - 1;}else if (begin2 >= n){//将第二段序列改为不存在的序列即可begin2 = n;end2 = n - 1;}else if (end2 >= n){//修正区间end2 = n-1;}while (begin1 <= end1 && begin2 <= end2){if (a[begin1] <= a[begin2]){tmp[j++] = a[begin1++];}else{tmp[j++] = a[begin2++];}}//如果第二段序列先结束while (begin1 <= end1){tmp[j++] = a[begin1++];}//如果第一段序列先结束while (begin2 <= end2){tmp[j++] = a[begin2++];}}//将临时数组的内容拷贝回原数组memcpy(a, tmp, sizeof(int) * n);//控制间隔rangeN *= 2;}//释放与置空free(tmp);tmp = NULL;
}

http://www.yayakq.cn/news/579969/

相关文章:

  • 外卖网站建设价钱小学学校网站
  • 外包公司属于什么行业搜索seo优化
  • 沈阳的网站制作公司哪家好一个网站多个数据库
  • 网站内容建设策略导出WordPress文件格式
  • 河南制作网站做广告的软件app
  • 自助式网站建设 济南网站有备案是正规的吗
  • 深圳网站设计公司有哪些手机网站设计案例
  • wordpress安裝网站改版与优化协议书
  • 建网站公司下载快手怎样建网站 需要
  • 简单的招聘网站怎么做用vue-cli做的网站
  • 化工材料 技术支持 东莞网站建设网站建设覀金手指科杰
  • 建设官方网站首页网络营销推广的5种方法
  • 网站建设管理典型经验材料wordpress 分类目录 层级
  • 旅游类网站开发任务书wordpress用户积分中心
  • 湖北省建设网站首页郑州网站制作网页
  • 开一个网站需要什么erp企业管理系统有哪些软件
  • 临清市住房和城乡建设局网站网站关键词设置
  • 做网站必须认证吗品牌建设存在问题
  • django做的网站举例设计传媒公司logo
  • 微信与网站对接企业网站建设存在的不足与困难
  • wan网站建设川制作官方网站
  • 网站内容优化的准则wordpress关闭某个分类
  • 网站建设基本模板介绍西安网络广播电视台
  • 建设报名系统是正规网站吗做医疗竞价网站
  • 西安有哪些网站建设外包公司好精准流量推广
  • 网络建设的网站wordpress文章发布到专题
  • 肥乡网站建设百度网站是怎么做的
  • 南头做网站公司北京经济技术开发区建设局网站
  • 在线观看免费网站网址阿坝州做网站公司
  • 如何做微信官方网站线上渠道推广