zoukankan      html  css  js  c++  java
  • DSA——归并排序笔记

    分治思想

    分:将n个元素的序列划分为两个序列,再将两个序列划分为4个序列,直到每个序列只有一个元素,

    并:逐渐将两个有序序列归并成一个有序的序列。

    看两个东西:

    http://www.cnblogs.com/jillzhang/archive/2007/09/16/894936.html这篇也给了我很大的帮助

    http://www.acfun.cn/v/ac1250089舞蹈表现归并排序,非常有趣,一目了然

    下面是自个写的代码

        public  void merge_sort(int[] r,int low,int high)
        {
            int mid=(low+high)/2;
            if(low<high)//至少有两个元素
            {
                merge_sort(r,low,mid);
                merge_sort(r,mid+1,high);
                merge(r,low,mid,high);
            }
            
        }
    
        public void merge(int[] r,int low,int mid,int high)
    
        {
            //就是合并两个数组,非常简单其实
            int[] temp=new int[high-low+1];
            int ia=low;
            int ib=mid+1;
            int it=0;
            int k;
            while(ia<=mid&&ib<=high)//数组的左子数组和右子数组都有元素
            {
                if(r[ia]<r[ib])
                {
                    temp[it++]=r[ia++];
                }
                else{
                    temp[it++]=r[ib++];
                }
            }
                    //把剩余的插入temp
            while(ia<=mid) temp[it++]=r[ia++];
            while(ib<=high)temp[it++]=r[ib++];
            ia=low;
            for(k=0;k<it;k++)
            {
                r[ia+k]=temp[k];
            }

    因为要保证A被排序了,所以要将结果还给A }

      红色部分标示的就是我花费了很长时间才搞清楚的地方,发现错误的地方,一直觉得不用=,错把mid当做长度了,忘记a[mid]也是左子数组的一员了,估计我再也不会忘了。。

    //这是一点牢骚,几个小时呢,花在这个上面,现在是14:53,下午大概45分钟,上午也是,还有28号那天想了好久

    感觉自己有点笨,虽然不太想承认,而且明明最后中午之前已经把思路完完全全的搞清楚了,甚至大致的代码都写对了,因为四个等号,单步调试,因为是递归,非常恶心,还各种画图,又开始借书,上网找源码,浪费了很多很多时间·····

    不过无论如何,终于把这个搞清楚了,当时学的时候一点也不扎实,或许别人也都用了不少时间才想清楚吧,不过现在这样已经很好了,加油!---------0305.14:57

  • 相关阅读:
    第十一次作业——LL(1)文法
    wechall前十题
    [V&N2020 公开赛]TimeTravel 复现
    CTFHub web技能树之RCE初步 命令注入+过滤cat
    算法第四章作业
    算法第四章上机实践报告
    算法第三章作业
    算法第三章上机实践报告
    算法--第二章作业
    算法第二章上机报告
  • 原文地址:https://www.cnblogs.com/Cherrylalala/p/6478764.html
Copyright © 2011-2022 走看看