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

网站的规划 建设与分析论文网站建设品牌

网站的规划 建设与分析论文,网站建设品牌,品牌全案策划设计公司,电商平台推广工具有哪些目录 前言 递归实现 代码实现 非递归实现 代码实现 总结 前言 归并排序#xff08;Merge sort#xff09;是建立在归并操作上的一种有效的排序算法。该算法是采用分治法#xff08;Divide and Conquer#xff09;的一个非常典型的应用。 作为一种典型的分而治之思想…目录 前言 递归实现 代码实现 非递归实现 代码实现 总结 前言 归并排序Merge sort是建立在归并操作上的一种有效的排序算法。该算法是采用分治法Divide and Conquer的一个非常典型的应用。 作为一种典型的分而治之思想的算法应用归并排序的实现由两种方法 自上而下的递归所有递归的方法都可以用迭代重写所以就有了第 2 种方法自下而上的迭代 和选择排序一样归并排序的性能不受输入数据的影响但表现比选择排序好的多因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。 递归实现 在我们前边的学习过程中例如合并两个有序数组等问题我们就使用过归并的思想本质上来说归并排序还是分治的思想将大问题化为小问题然后解决小问题最终是实现大问题的解决。 动图演示 归并排序的递归实现并不复杂有以下几个步骤 1.首先申请一段空间tmp用来保存以及排好序的部分数据当所有数据都排序完后重新拷贝回原数组。 2.对数组数据进行分割例如二叉树分为左右子树一样也将数组分割为左右数组知道左指针left大于等于右指针right时返回。 3.对以及递归好的数据进行排序两个区域内的数据进行比较小的数据插入到tmp数组中直至到数组的最后一个数据如果当一个数组提前结束直接将另外一个数组数据直接拷贝即可。 4.将排序好的tmp数组拷贝回原数组。 代码实现 由于原函数不适合递归所以我们定义子函数并且求出left和right进行递归将数组分为[left,mid]和[mid1,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越界即end1n。 2.begin2越界即begin2n。 3.end2越界即end2n。 所以我们要对边界进行修正当边界n时我们将其赋值为n-1修正如下 if (end1 n){end1 n - 1;}if (begin2 n){begin2 n;end2 n - 1;}if (end2 n){end2 n - 1;} 我们注意到当begin1n时我们将begin2 赋值为nend2赋值为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://www.eeditor.cn/news/121574/

相关文章:

  • 电子商务网站建设心得河南搜索引擎推广多少钱
  • 泰安网络推广联系昔年下拉昆明优化公司
  • 网站前端制作费用北京网站托管
  • 郑州网站优化软件推广赚钱网
  • html5网站建设源码单页面销售信网站赚钱系统
  • 网站备案得多长时间河北建设工程网站
  • 网站做直播需要资质吗高端品牌网站建设有哪些注意事项
  • 专用主机方式建设网站如何创立自己的网址
  • 酒泉市城乡建设局网站网站欢迎页设计
  • 布吉医院网站建设做网站书
  • 商城网站建设的注意事项网页首页设计模板免费
  • 网站建设 培训离石市网站建设公司
  • 网站上的销售怎么做网站开发说明
  • 平台和自建网站服务提供者网上购物哪个商城好
  • qq官方网站搜索引擎优化工具
  • 网站技术说明书模板摄影设计师招聘
  • 昆明建设银行纪念币预约网站有关于网站建设的参考文献
  • 嘉兴中元建设网站怎样制作免费网页
  • 做app 的模板下载网站有哪些樱花动漫imomoe官网入口
  • 做网站什么语言最好创新logo标志设计
  • 网站定制公司哪家最权威pc网站制作公司
  • 宽带固定ip的怎么做网站服务器如何做响应式网站视频教程
  • 有网站了小程序怎么做phpcms 网站根目录
  • o2o网站建设方案wordpress主题开拓右边栏
  • 个人与公司网站备案五华网站建设
  • 网站设计及内容策划深圳华强北现在能去吗
  • 做网站和app一个好的网站建设需要多少钱
  • wordpress 瀑布流ajaxseo 专业为网站建设
  • 创建网站代码是什么问题公司的宣传片怎么制作
  • 那里有制作网站公司信息系统开发流程