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

原文地址:https://www.cnblogs.com/Cherrylalala/p/6478764.html