• 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

  • 相关阅读:
    谷歌推开发者培训指南 欲提升Android软件质量
    装饰者模式【java版】
    Java GetBytes 编码方式
    为什么程序员都是夜猫子
    Android的Handler总结
    常见的自然法则及管理启示
    java常用设计模式
    Android optionsmenu例程
    关于程序员成长的一点思考
    Java 字节流读写文件
  • 原文地址:https://www.cnblogs.com/Cherrylalala/p/6478764.html
Copyright © 2020-2023  润新知