今天,我将继续与您分享排序算法中的另一个排序算法:合并排序!一,合并排序:1.合并排序操作的核心思想是:a。确定分界点:mid =(l + r)/ 2 b,递归对左侧和右侧进行排序(在左侧和右侧排列数字后,它将成为两个有序序列)c。
合并(将上面的两个有序序列合并为一个有序序列,使用一个简单的单词Is is two into a!)。2.示例:例如,在上图中,我们已经安排了两组序列号。
我们要在第三步中合并。如何进行?这个想法如下:这是一个空的。
数组res,主要用于临时存储合并序列的排序编号;从图中我们可以看到,第一个序列指针i指向数字1,第二个序列指针j指向2。这时,我们必须比较两个数字。
较小的数字放置在临时数组res中。在这里,我们显然知道数字1小于2,因此我们将临时数组res中的1放入b,然后指针i下移,如下图所示,再次进行比较。
指针j指向的数字2较小。将其放在res中,然后指针j下移,指针i不移动,依此类推,以此类推。
如下图所示,两个指针都指向数字。 5.如果遇到两个相同的数字,通常将第一个序列的数字放入临时数组res中。
此时,要注意d。最后,将临时数组中的数字放入原始数组中。
注意:一种算法是稳定的,不能说它的时间效率是稳定的;这里的稳定性是指,如果两个数字在排序后的位置仍未更改,则两个数字相同。 ,则此排序是稳定的,反之亦然! 3.合并排序的平均时间复杂度的计算和推导:注:图片来源:https://visualgo.net/zh/sorting从图片的垂直度来看,当拆装为1时,此时的数字是多少等于n除以等于1,通过计算,我们知道它是logn,然后从水平分析中,我们最多只能比较n个数字,因此合并和排序的时间复杂度为:nlogn 2。
代码示例:代码:#include using namespace std; const int N = 1e5 + 10; int n; int q [N],tmp [N]; void merge_sort(int q [],intl,intr){If(l&gt ; = r)return; //判断该序列是否为空或只有一个数字,如果是,则无需对其进行排序//确定分界点int = 1 + r> 1; //递归处理merge_sort(q,l,mid); merge_sort(q,mid + 1,r); //定义双指针int k = 0,i = l,j = mid + 1; //合并处理while(i if(q [i] else tmp [k ++] = q [j ++]; //将源数组中的剩余数字(请注意此处的数字必须是最小的)放在临时数组后面,而(i while(j)//安排临时数组将序列号放入(i = l,j = 0; i} intmain(){scanf(“%d”,& n); (inti = 0; i {scanf(“%d”,& q [i]);} merge_sort(q,0,n-1); for(int i = 0; i {printf(“% d”,q [i]);}返回0;}结果:最后这是合并排序的更生动的演示视频(来源:https://visualgo.net/en/sorting):参考:https:// www .acwing.com / problem / content / description / 789 / -END-来源| txp嵌入式作者| txp |组织有关相关技术传播的文章,版权归原始作者所有| |如果存在侵权,请联系以将其删除| [1]在C中实现:两种用于平均值计算的算法[2]单片机DSP必不可少的概念:快速教您Fo urier算法[3]几种常见的验证算法[4] C语言编程:九种搜索算法(带有完整的代码)[5]图形化机器学习:请不要说您看不懂该算法!免责声明:本文内容经21ic授权后发布,版权归原作者所有。该平台仅提供信息存储服务。
本文仅代表作者的个人观点,并不代表该平台的立场。如有任何疑问,请与我们联系,谢谢!。