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

威海网站建设是什么互联网保险销售行为可回溯管理

威海网站建设是什么,互联网保险销售行为可回溯管理,网站 用php asp源码 比较好,win2003 iis做网站基本思想: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个…

基本思想: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有 序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

归并排序核心步骤:先将数组分组,往下分直到分为1个数据,然后开始合并,两两合并,合并的时候先比较两组数据中的数据的大小,按顺序依次合并到临时数组temp中,然后再将合并到temp数组中有序的数据覆盖到原数组中。

#include <stdio.h>
// 归并排序
// 时间复杂度O(N*logN)
// 空间复杂度O(N)
void _MergeSort(int* arr, int left, int right, int* temp)
{if (left >= right)return;// 递归划分区间,直到区间内只有一个数据后开始归并int mid = (left + right) / 2;// [left,mid] [mid+1,right]_MergeSort(arr, left, mid, temp);_MergeSort(arr, mid+1, right, temp);// 归并[left,mid] [mid+1,right]有序,归并到temp了int begin1 = left, end1 = mid;int begin2 = mid + 1, end2 = right;int index = begin1;while (begin1 <= end1 && begin2 <= end2){if (arr[begin1] < arr[begin2])temp[index++] = arr[begin1++];elsetemp[index++] = arr[begin2++];}// 可能有一段没结束,具体那一段不知道,只有一个循环可以进入while(begin1<=end1)temp[index++] = arr[begin1++];while (begin2 <= end2)temp[index++] = arr[begin2++];// 将归并后在temp的数据拷贝回原数组for (int i = left;i <= right; i++){arr[i] = temp[i];}
}// 归并排序
void MergeSort(int* arr, int n)
{assert(arr);int* temp = malloc(sizeof(int) * n);// 传入闭区间【0,n-1】_MergeSort(arr, 0, n - 1, temp);free(temp);
}void TestMergeSort()
{int arr[] = { 15,18,23,3,1,14,2,8,4,9,6,0,7 };MergeSort(arr, sizeof(arr) / sizeof(arr[0]));Printarry(arr, sizeof(arr) / sizeof(arr[0]));
}void TestMergeSortNonR()
{int arr[] = { 15,18,23,3,1,14,2,8,4,9,6,0,7 };MergeSortNonR(arr,sizeof(arr) / sizeof(arr[0]));Printarry(arr, sizeof(arr) / sizeof(arr[0]));
}int main()
{//TestInsertSort();//TestShellSort();//TestSelectSort();//TestBubbleSort();//TestHeapSort();//TestQuickSort();TestMergeSort();TestMergeSortNonR();return 0;
}

函数的递归实现图:

非递归法

从上面的递归图可以看出,合并的时候是2个数据开始合并,也就是区间【0,0】和【1,1】合并,【2,2】和【3,3】合并;然后【0,1】和【2,3】合并到这里时是两个数据两个数据之间合并,依次类推。那么非递归方法,需要控制好合并的下标即可。

// 归并排序--非递归方法
void MergeArry(int* arr, int begin1, int end1, int begin2, int end2, int* temp)
{int left = begin1, right = end2;int index = begin1;while (begin1 <= end1 && begin2 <= end2){if (arr[begin1] < arr[begin2])temp[index++] = arr[begin1++];elsetemp[index++] = arr[begin2++];}// 可能有一段没结束,具体那一段不知道while (begin1 <= end1)temp[index++] = arr[begin1++];while (begin2 <= end2)temp[index++] = arr[begin2++];// 将归并后在temp的数据拷贝回原数组for (int i = left;i <= right; i++){arr[i] = temp[i];}
}void MergeSortNonR(int* arr, int n)
{assert(arr);int* temp = malloc(sizeof(int) * n);int gap = 1;  // 控制几个数据的合并排序while (gap < n){for (int i = 0;i < n;i += 2 * gap){// 归并+排序的区间(数组长度不是2的次方数时第二组可能会越界访问)// [i,i+gap-1] [i+gap,i+2*gap-1]int begin1 = i, end1 = i + gap - 1;    // 第一组int begin2 = i + gap, end2 = i + 2 * gap - 1;  // 第二组// 1、合并时只有第一组if (begin2 >= n)break;// 2、合并时第二组只有部分数据,需要修正边界if (end2 >= n)end2 = n - 1; // 只有一个数值的时候,直接让end2=最后一个数值就行了MergeArry(arr, begin1, end1, begin2, end2, temp);}Printarry(arr, n);gap *= 2;}free(temp);
}

实现图:

结论:

归并排序是一种基于分治思想的有效排序算法,其核心是通过递归将数组不断二分直至单个元素,然后按顺序合并有序子序列。算法分为递归和非递归两种实现方式:递归法通过_MergeSort函数划分区间并调用自身,然后将有序子序列合并到临时数组后回写;非递归法使用MergeSortNonR函数,通过gap变量控制合并步长,逐步扩大有序区间。两种方法都使用MergeArry函数进行具体合并操作,时间复杂度均为O(N*logN),空间复杂度为O(N)。代码示例展示了完整的实现过程,包括边界处理和数据拷贝等关键步骤。

http://www.dtcms.com/wzjs/795138.html

相关文章:

  • 做网站好赚钱网站专题设计软件
  • 网站头部导航在家有电脑怎么做网站
  • 可视化网站制作软件大学生个人简历电子版模板
  • 新乡网站建设-中国互联工业设计出来做什么
  • 好享购物官方网站购物竞价推广外包托管
  • 建网站卖饮料做网站编程
  • 服装生产厂商网站建设方案南宁网站建设设计
  • 给网站写文章怎么做贵阳seo网站推广
  • 网站定位分析是什么wordpress如何添加注册登录界面
  • 一个网站一年多少钱江西网站开发方案
  • 广西桂林建设局网站前端网页代码
  • 浙江高端网站建设网站建设兼职挣多少钱
  • 什么网站专做宠物物品wordpress+软件+入门
  • 长沙做公司网站大概多少钱网站如何做免费推广
  • 如何判断一个网站的价值毕业设计做音乐网站可以吗
  • 深圳团购网站建设PS做网站报价
  • 用墨刀做视频网站家装品牌排行榜前十名
  • 效果图哪个网站好页面设计时最好
  • 阳泉网站开发天津建设银行招聘网站
  • 网站建设后台程序用什么语言wordpress 升级提示
  • 静态网站模板中英文环翠区网站建设
  • 漳州城乡建设局网站首页图片如何连接到wordpress
  • 国家对网站建设政策网站制作的总结与体会
  • 网站不被收录了wordpress发布站点
  • 网站建设广告语郑州seo询搜点网络效果佳
  • 免费教做面食的网站烟台企业自助建站系统
  • 设计师做单页的网站中英企业网站系统
  • 天津南开做网站做公司网站要钱吗
  • 做电脑网站用什么软件有哪些方面优化设计的答案
  • 优秀网站大全网站首页快照应该怎么