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

归并排序(非递归)超详细解答!!

首先归并排序采取了分治的思想,其次在数据存储的过程中,需要开辟一个辅助数组进行两个数组按序插入,最后再将辅助数组中数据返回。

代码详细解答如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,j,i;

    scanf("%d",&n);
    int num[n],num1[n];//num1为辅助存储数组

    for( i=0; i<n; i++)
        scanf("%d",&num[i]);

    int leftstart,leftend;
    int rightstart,rightend;

    for( i=1; i<n; i*=2)//一开始数组长度单位为1,从1开始逐渐乘2直到等于n大小
    {
        for (leftstart=0; leftstart<n-i; leftstart=rightend)//leftstart=rightend意思为从左边逐渐过渡到右边的一个又一个数组,因为被分成了间隔为i的多个数组,都要归并排序
        {
            leftend = leftstart + i;//左边的结束就是右边的开始,左边数组的开始与结束的间隔为i那么长
            rightstart = leftstart + i;
            rightend = rightstart + i;

            if(rightend>n)
            {
                rightend = n;//rightend在循环时可能发生越界,拉回来
            }
            j=0;
            while (leftstart<leftend && rightstart<rightend)//不能等于,因为从0开始存储,leftend-1是最后一个了,等于时已经是右边那个数组的开始了
            {
                if(num[leftstart]<num[rightstart])//将一个数组从中分为两边,即归并排序分为两个更小数组,然后将这两个数组中的数按大小插入num1数组
                    num1[j++] = num[leftstart++];
                else
                    num1[j++] = num[rightstart++];
            }

            if(leftstart<leftend)//左边那部分还没全部归并入辅助数组
            {
                while (leftstart <leftend)
                {
                    num1[j++] = num[leftstart++];
                }
            }
            else if(rightstart<rightend)//右边那部分还没全部归并入辅助数组
            {
                while (rightstart <rightend)
                {
                    num1[j++] = num[rightstart++];
                }
            }

            while(j>0)
            {
                num[--rightstart] = num1[--j];//再将num1的数放回去,num1作为两个数组按大小合并后的数组数据返回给num数组
            }
        }

        //for(int l=0; l<n; l++)
        //    printf("%d ",num[l]);
        //printf("\n");

    }
    
    printf("归并排序后:");
    for(int l=0; l<n; l++)
            printf("%d ",num[l]);

}

欢迎大家评论区留言 

 觉得该篇文章有用的请不要忘记忘记点击右下角的大拇指~

欢迎大家关注我的公众号:Smooth前端成长记录
公众号同步更新CSDN博客内容,想方便阅读博客的C友可以来关注我的公众号以便获得更优良的阅读体验~

 

相关文章:

  • PAT乙级 一元多项式求导(1010)详细解答c++
  • C语言课程设计物品竞拍管理(成品版!)
  • 折半查找判定树的画法(较简单易懂!)
  • 剑指 Offer 58 - I. 翻转单词顺序c++解法
  • 2. 两数相加 -力扣c++解法
  • 7.整数反转 - 力扣(LeetCode)
  • 1523. 在区间范围内统计奇数数目 -力扣
  • 9. 回文数 -力扣(leetCode)c++解法
  • 想要学会c++的STL?这一篇文章就足够啦!
  • 455. 分发饼干 -力扣(leetCode)c++贪心算法
  • 135. 分发糖果 -力扣(leetCode)c++贪心算法
  • 435. 无重叠区间 -力扣(leetCode)c++贪心算法
  • 605. 种花问题 -力扣(leetCode)c++贪心算法
  • 关于DOM的w3c文档学习笔记总结
  • 浏览器实现cookie的操作详解!!!推荐新手观看
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 3.7、@ResponseBody 和 @RestController
  • Angular6错误 Service: No provider for Renderer2
  • ES6 学习笔记(一)let,const和解构赋值
  • java 多线程基础, 我觉得还是有必要看看的
  • Java基本数据类型之Number
  • jquery cookie
  • php ci框架整合银盛支付
  • spring boot 整合mybatis 无法输出sql的问题
  • XForms - 更强大的Form
  • 小试R空间处理新库sf
  • 硬币翻转问题,区间操作
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ​secrets --- 生成管理密码的安全随机数​
  • ​第20课 在Android Native开发中加入新的C++类
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #Linux(帮助手册)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • $jQuery 重写Alert样式方法
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (汇总)os模块以及shutil模块对文件的操作
  • (转)视频码率,帧率和分辨率的联系与区别
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .Net 路由处理厉害了
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .考试倒计时43天!来提分啦!
  • ??在JSP中,java和JavaScript如何交互?
  • @Controller和@RestController的区别?
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [20161101]rman备份与数据文件变化7.txt
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [Android学习笔记]ScrollView的使用
  • [CF407E]k-d-sequence
  • [cogs2652]秘术「天文密葬法」
  • [CSS3备忘] transform animation 等