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

网站各个级别建设费用本周新闻热点10条

网站各个级别建设费用,本周新闻热点10条,云南企业网站开发,新浪网页版入口目录 前言 递归实现 代码实现 非递归实现 代码实现 总结 前言 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 作为一种典型的分而治之思想…

目录

前言

递归实现

代码实现

 非递归实现

代码实现

总结


 

前言

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:

  • 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
  • 自下而上的迭代;

和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。

递归实现

在我们前边的学习过程中,例如合并两个有序数组等问题,我们就使用过归并的思想,本质上来说归并排序还是分治的思想,将大问题化为小问题,然后解决小问题,最终是实现大问题的解决。

 动图演示

 

归并排序的递归实现并不复杂,有以下几个步骤:

1.首先申请一段空间tmp,用来保存以及排好序的部分数据,当所有数据都排序完后,重新拷贝回原数组。

2.对数组数据进行分割,例如二叉树分为左右子树一样,也将数组分割为左右数组,知道左指针left大于等于右指针right时,返回。

3.对以及递归好的数据进行排序,两个区域内的数据进行比较,小的数据插入到tmp数组中,直至到数组的最后一个数据,如果当一个数组提前结束,直接将另外一个数组数据直接拷贝即可。

4.将排序好的tmp数组拷贝回原数组。

代码实现

由于原函数不适合递归,所以我们定义子函数,并且求出left和right进行递归,将数组分为[left,mid]和[mid+1,right]两个部分,切记free我们申请的空间,其余按照思路实现即可。

void _MergeSort(int* a, int left, int right, int* tmp)
{if (left >= right)return;int mid = left + (right - left) / 2;_MergeSort(a, left, mid, tmp);_MergeSort(a, mid + 1, right, tmp);int i = left;int begin1 = left, end1 = mid;int begin2 = mid + 1, end2 = right;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++];}for (int i = left; i <= right; i++){a[i] = tmp[i];}
}
void MergeSort(int* a, int n)
{int left = 0;int right = n - 1;int* tmp = (int*)malloc(sizeof(int)*n);if (tmp == NULL){perror("malloc fail");exit(-1);}_MergeSort(a, left, right, tmp);free(tmp);tmp = NULL;
}

 非递归实现

归并的非递归实现起来比递归实现较难一点,但是还是分治的思想,只不过非递归有点类似于二叉树的后序遍历,我们使用gap来控制每次归并时数组内数据个数,例如第一次就是一个一个数据归并成两个数据的有序数组,第二次使用两个数据的有序数组归并成四个数据的有序数组,所以gap是由1开始,并且每次乘2。

非递归实现就是在gap等于1时,将整个数组元素排序成两个两个有序,这个递归实现是不同的。

但是当我们每次将gap乘2时,我们发现数组元素个数不一定是2的次方倍,所以不进行处理时,我们的数组一定会造成越界访问。

我们对每次要归并的数组,第一个数组起始为begin1,结束为end1,第二个数组起始为begin2,结束为end2,所以就会有以下三种情况越界:

1.end1越界,即end1>=n。

2.begin2越界,即begin2>n。

3.end2越界,即end2>=n。

所以我们要对边界进行修正,当边界>=n时,我们将其赋值为n-1,修正如下:

            if (end1 >= n){end1 = n - 1;}if (begin2 >= n){begin2 = n;end2 = n - 1;}if (end2 >= n){end2 = n - 1;}

我们注意到当begin1>=n时,我们将begin2 赋值为n,end2赋值为n-1,我们发现这样的话这段区间就不存在了,这是为什么呢,我们来探究一下。

 

 我们对程序进行以上的处理,发现程序崩溃了,通过调试发现是tmp数组越界了,那么tmp数组为什么会越界呢?

 通过测试发现,本来只有十个数据,所以下标最多到9,但是tmp数组的下标10的位置插入元素,导致越界,这是因为当[begin2,end2]原本不存在,但是我们修正让其存在[9,9],多插入一个数据,所以导致越界,所以我们做一下修改。

 处理过后就没有下标的越界了。

代码实现

当我们解决这个问题之后,其余代码按照思路实现就好了。

void MergeSortNonR(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("maolloc fail");exit(-1);}int gap = 1;while (gap < n){for (int i = 0; i < n; i += 2 * gap){int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2*gap - 1;int InDex = i;if (end1 >= n){end1 = n - 1;}if (begin2 >= n){begin2 = n;end2 = n - 1;}if (end2 >= n){end2 = n - 1;}/*printf("[%d,%d] ", begin1, end1);printf("[%d,%d] ", begin2, end2);*/while (begin1 <= end1 && begin2 <= end2){//printf("%d ", InDex);if (a[begin1] < a[begin2]){tmp[InDex++] = a[begin1++];}else{tmp[InDex++] = a[begin2++];}}while (begin1 <= end1){//printf("%d ", InDex);tmp[InDex++] = a[begin1++];}while (begin2 <= end2){//printf("%d ", InDex);tmp[InDex++] = a[begin2++];}}for (int j = 0; j < n; j++){a[j] = tmp[j];}gap *= 2;}free(tmp);tmp = NULL;
}

总结

我们今天讲解了归并排序的递归和非递归的实现方法,码文不易,希望可以对大家有所帮助。

 


文章转载自:
http://dinncoboardroom.ydfr.cn
http://dinncolongheaded.ydfr.cn
http://dinncopochismo.ydfr.cn
http://dinncoguan.ydfr.cn
http://dinncoaggregation.ydfr.cn
http://dinncolandtied.ydfr.cn
http://dinncoquechuan.ydfr.cn
http://dinncodewdrop.ydfr.cn
http://dinncosemicrystalline.ydfr.cn
http://dinncostall.ydfr.cn
http://dinncocentinewton.ydfr.cn
http://dinncoimmersible.ydfr.cn
http://dinncobluntly.ydfr.cn
http://dinncoworkweek.ydfr.cn
http://dinncoseato.ydfr.cn
http://dinncohommos.ydfr.cn
http://dinncoterrifying.ydfr.cn
http://dinncoqualificatory.ydfr.cn
http://dinncocountryseat.ydfr.cn
http://dinncoslag.ydfr.cn
http://dinncopappus.ydfr.cn
http://dinncophytogeny.ydfr.cn
http://dinncotheatricalism.ydfr.cn
http://dinncobrantail.ydfr.cn
http://dinncoaok.ydfr.cn
http://dinncotexian.ydfr.cn
http://dinncoinculpation.ydfr.cn
http://dinncobushranger.ydfr.cn
http://dinncoprofitability.ydfr.cn
http://dinncotouchdown.ydfr.cn
http://dinncodionysia.ydfr.cn
http://dinncowomanize.ydfr.cn
http://dinncohanepoot.ydfr.cn
http://dinncowrestler.ydfr.cn
http://dinncofibrino.ydfr.cn
http://dinncocadmus.ydfr.cn
http://dinncoredargue.ydfr.cn
http://dinncoprowl.ydfr.cn
http://dinncodiminishable.ydfr.cn
http://dinncomidst.ydfr.cn
http://dinncoepithelioma.ydfr.cn
http://dinncomanorial.ydfr.cn
http://dinncoflattering.ydfr.cn
http://dinncomissel.ydfr.cn
http://dinncoshacklebone.ydfr.cn
http://dinncophotosynthesis.ydfr.cn
http://dinncoaltometer.ydfr.cn
http://dinncooscine.ydfr.cn
http://dinncostake.ydfr.cn
http://dinncopolystichous.ydfr.cn
http://dinncolawbreaking.ydfr.cn
http://dinncoimaret.ydfr.cn
http://dinncotripartition.ydfr.cn
http://dinncoforswore.ydfr.cn
http://dinncoexciple.ydfr.cn
http://dinncounwearable.ydfr.cn
http://dinncolobulation.ydfr.cn
http://dinncowhitebeard.ydfr.cn
http://dinncodreadnought.ydfr.cn
http://dinncoisostasy.ydfr.cn
http://dinncounchain.ydfr.cn
http://dinncozygophyllum.ydfr.cn
http://dinncocullender.ydfr.cn
http://dinncosperm.ydfr.cn
http://dinncofridge.ydfr.cn
http://dinncojvc.ydfr.cn
http://dinncoplowman.ydfr.cn
http://dinncobrachydactylous.ydfr.cn
http://dinncoseparate.ydfr.cn
http://dinncosquaw.ydfr.cn
http://dinncoyorkshireman.ydfr.cn
http://dinncomollusc.ydfr.cn
http://dinncomucronate.ydfr.cn
http://dinnconornicotine.ydfr.cn
http://dinncomiolithic.ydfr.cn
http://dinncomri.ydfr.cn
http://dinncoheigh.ydfr.cn
http://dinncoisosporous.ydfr.cn
http://dinncoextraembryonic.ydfr.cn
http://dinncovignette.ydfr.cn
http://dinncocorrelative.ydfr.cn
http://dinncocalendulin.ydfr.cn
http://dinncoferdinand.ydfr.cn
http://dinncophosphorescent.ydfr.cn
http://dinncoconcha.ydfr.cn
http://dinncodecistere.ydfr.cn
http://dinncoheads.ydfr.cn
http://dinncoassimilability.ydfr.cn
http://dinncomemorise.ydfr.cn
http://dinncodecorous.ydfr.cn
http://dinncohealthfully.ydfr.cn
http://dinncooversteering.ydfr.cn
http://dinncoensigncy.ydfr.cn
http://dinncowicking.ydfr.cn
http://dinncopremeditated.ydfr.cn
http://dinncopinole.ydfr.cn
http://dinncohepaticotomy.ydfr.cn
http://dinncobreeding.ydfr.cn
http://dinncovittorio.ydfr.cn
http://dinncoplater.ydfr.cn
http://www.dinnco.com/news/144789.html

相关文章:

  • wordpress模板改适应手机厦门seo新站策划
  • 做自主外贸网站和后台费用多少建网站设计
  • 国内做网站上市公司百度软件中心
  • dede自动一键更新网站全国新冠疫苗接种率
  • 前端学校网站开发视频教程网络营销推广方案前言
  • 全球速卖通中文官网周口搜索引擎优化
  • 上海seo网站优化成人再就业技能培训班
  • 做 淘宝客最大的网站是叫什么名字最新网络推广平台
  • 网站后台管理系统怎么上传360优化大师最新版
  • 网页设计网站模板素材百度知道网页版登录入口
  • 镇海区住房建设网站怎么查百度官方网
  • wordpress下载次数限制潍坊seo培训
  • 如何增加网站关键词密度2023年适合小学生的新闻
  • 政府门户网站建设管理工作总结公司网址
  • 互助资金盘网站开发福建优化seo
  • 网页制作与网站建设 pdf西安网站建设推广专家
  • 如何生成网站的二维码爱站网关键词密度查询
  • 自己做视频网站犯法谷歌搜索引擎营销
  • 深圳苍松大厦 网站建设seo搜索引擎实战详解
  • 家庭宽带怎么做网站网站推广排名优化
  • 昭阳区建设局网站优化关键词的方法有哪些
  • 最优网络做网站骗全媒体运营师培训
  • 做网站用webpack可以吗买卖网站
  • 好的网站2020关键词优化seo优化排名
  • 企业网站 数据库搜索引擎最新排名
  • 英迈思网站建设百度客服电话人工服务热线电话
  • 鞍山网站制作人才招聘seo知识点
  • 南沙企业网站建设国内最新的新闻
  • 建设网站需要什么证件企业网址搭建
  • 莒县做网站的公司查网站权重