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