合并算法采用分治法的思路,即问题划分成n个规模较小而结构和原来问题相似的子问题,递归解决这些子问题,然后合并结果,最终得到原来问题的解。
合并算法主要分为三个部分,第一个部分是分解,将运来的问题分解成两个包含n/2个元素的数组的排序的问题,然后分别递归调用函数解决这两个数组的排序问题,最后一步,就是将已经排好序的数组重新进行组合,使其成为按序排列的数组。
这三步中代码量较多的就是合并的代码了,合并的问题其实我们也可以把它想象成把两堆已经按从小到大的顺序排好的扑克牌排成一堆扑克牌的问题,每次比较最上面的那个牌,小的就拿走放到输出堆中,重复这个比较过程直到某一堆牌为空,然后把另外一堆牌直接放到输出堆中这个比较过程就结束了,想清楚了了这个过程的话理解代码就不难了。
//将两个数组按照顺序重新进行排列 public static void Merge(int[] rawArray, int firstIndex, int middleIndex, int lastIndex) { //把middle指向的元素划分到前面的一个数组去 int firstArrayCount = middleIndex - firstIndex + 1; int secOndArrayCount= lastIndex - middleIndex; int[] firstArray = new int[firstArrayCount]; int[] secOndArray= new int[secondArrayCount]; //将原来数组的元素分别复制到两个分开的数组当中去 for (int i = 0; i看懂了上面的合并,下面这个递归调用就没什么了,函数将数组进行拆分,然后递归调用函数进行子数组的排序,子数组排序完成后调用合并函数将数组进行合并。
////// /// /// 需要排序的数组 /// 左边界 /// 右边界 public static void MergeSort(int[] rawArray, int firstIndex, int lastIndex) { if (firstIndex合并排序体现的主要是一个将问题进行拆分解决的思路,通过递归调用函数来解决子问题,最后合并结果,从而得到原问题的解。
身边很多人在学数据结构和算法的时候对算法的语言有着特殊的要求,个人觉得学习算法学习的是一种解决问题的思路,而不是具体的代码实现,this is the point….
本文地址:http://www.nowamagic.net/librarys/veda/detail/248,欢迎访问原出处。