归并排序
2016-07-15 11:29
169 查看
归并排序比简单排序有效率的多,归并排序的时间复杂度只要O(N*logN),至少在速度上是这样的。
归并排序的一个缺点就是它需要在存储器上有另一个大小等于被排序的数据项的数目的数组。如果初始数组几乎站满整个存储器,那么归并排序将不能工作。但是有足够的空间,归并排序会是一个很好的选择。
归并两个有序数组A,B,生成第三个数组C,数组C包含A,B中的所有数据项。
假设有两个有序数组,不要求有相同的大小。设数组A有四个数据项,B有6个数据项。他们被归并到C中,开始时数组C有10个空的存储空间。如下图:
归并操作的步骤如下:
归并代码:
归并排序的简单思想就是把一个数组分成两半,排序一半,然后用merge()方法把两半归并成一个有序数组。如何对每一个部分排序呢?这一次将地
递归:把每一半都分成两个四分之一。对每一个四分之一部分排序,然后把他们归并成一个有序的一半。
类似的,每一对八分之一部分归并成一个有序的四分之一,每一对十六分之一部分归并成一个有序的八分之一部分,以此类推。反复的分割数组,直到得到的字数组只含有一个数据项。这就是基值条件;设定只有一个数据项的数组是有序的。图示如下:
递归代码:
比较效率情况如下图所示:
归并排序的一个缺点就是它需要在存储器上有另一个大小等于被排序的数据项的数目的数组。如果初始数组几乎站满整个存储器,那么归并排序将不能工作。但是有足够的空间,归并排序会是一个很好的选择。
归并两个有序数组A,B,生成第三个数组C,数组C包含A,B中的所有数据项。
假设有两个有序数组,不要求有相同的大小。设数组A有四个数据项,B有6个数据项。他们被归并到C中,开始时数组C有10个空的存储空间。如下图:
归并操作的步骤如下:
归并代码:
public static void merge(int[] arrayA,int sizeA,int[] arrayB,int sizeB,int[] arrayC){ int Aindex=0;int Bindex=0;int Cindex=0; while(Aindex<sizeA &&Bindex<sizeB){ if(array[Aindex<arrayB[Bindex]){ arrayC[Cindex++]=arrayA[Aindex++]; } else{ arrayC[Cindex++]=arrayB[Aindex++]; } } while(Aindex<sizeA){ arrayC[Cindex++]=arrayA[Aindex++]; } while(Bindex<sizeB){ arrayC[Cindex++]=arrayB[Bindex++]; } }通过归并并进行排序:
归并排序的简单思想就是把一个数组分成两半,排序一半,然后用merge()方法把两半归并成一个有序数组。如何对每一个部分排序呢?这一次将地
递归:把每一半都分成两个四分之一。对每一个四分之一部分排序,然后把他们归并成一个有序的一半。
类似的,每一对八分之一部分归并成一个有序的四分之一,每一对十六分之一部分归并成一个有序的八分之一部分,以此类推。反复的分割数组,直到得到的字数组只含有一个数据项。这就是基值条件;设定只有一个数据项的数组是有序的。图示如下:
递归代码:
</pre><pre name="code" class="java"> private long[] theArray; public void mergesort(int[] workspace,int lowBound,int uperBound){ if(lowBound==uperBound){ return; } else{ int mid=(lowBound+uperBound)/2; mergesort(workspace,lowBound,mid); mergesort(workspace,mid+1,uperBound); merge(workspace,lowbound,mid+1,uperBound); } } public merge(int[] wokespace,int lowBound,int mid,int uperBound){ int low=lowBound; int Mid=mid-1; int uper=uperBound; int j=0; while(low<=Mid &&mid<=uper){ if(theArray[low]<theArray[mid]){ workspace[j++]=theArray[low++]; } else{ workspace[j++]=theArray[mid++]; } } while(low<=Mid){ workspace[j++]=theArray[low++]; } while(mid<=uper){ workspace(j++)=theArray[mid++]; } } public static void main(String[] args){ theArray=[.....]; int lowBound=0; int uperBound=theArray.length-1; long[] workspace=new long[theArray.length]; mergesort(workspace,lowBound,uperBound); for(int i=0;i<workspace.length;i++){ System.out.print(workspace[i]+" "); } }
比较效率情况如下图所示:
相关文章推荐
- 设计模式之单例模式
- Java文件操作大全(4)
- [转]ListView学习笔记(一)——缓存机制
- 测试GeoGebra博客
- RequireJS基础(三)
- Ajax+Struts2实现验证码验证功能实例代码
- opencv 拉伸、扭曲、旋转图像-仿射变换 opencv1 / opencv2 / python cv2(代码)
- Linux Bash shell (for循环)
- [置顶] SSH日期录入,日期精确不能精准到时分秒处理
- iOS 广告轮播图
- date 显示日期与时间
- 防御Linux下DDOS攻击
- 浅谈数论(四)扩展欧几里得算法与乘法逆元
- SDWebImage 的使用
- 浅谈数论(四)扩展欧几里得算法与乘法逆元
- WWDC 2012 Session笔记——405 Modern Objective-C
- Win32 SDK中窗口全屏处理
- OpenGL之坐标转换(好文-清晰版)
- apache2.2配置httpd.conf
- 基于HTML5+WebSocket+JAVA的棋牌游戏开发,从入门到放弃(一)