一段神奇的递归调用,一段神奇的数组合并!
要想搞清楚,首先弄明白两个问题:1、双层递归怎么走的。2、排好序的数组如何进行有序合并。
关于第一个问题,建议先看一下http://www.cnblogs.com/PerkinsZhu/p/5668218.html 看明白之后相信会对递归调用理解又进一个层次。
关于第二个问题,不解释了,在简练的语言也超越不了代码的简洁美!字节看代码吧!
说明:递归分解到的状态是数组元素只有一个。
合并之前的两个数组已经是有序状态。
程序中没有分割数组,只是根据数组下标对原数组进行递归分解。
public void MergeSort(int[] array) { printArray("原数组:", array); sort(array, 0, array.length-1); } private void sort(int[] array, int left, int right) { if (left >= right) return; int mid = (left + right) / 2; sort(array, left, mid); sort(array, mid + 1, right); merger(array, left, mid, right); } private void merger(int[] array, int left, int mid, int right) { time++; int[] temp = new int[array.length]; int tempIndex = left; int center = mid + 1; int tempLeft = left; while (left <= mid && center <= right) { if (array[left] < array[center]) { temp[tempIndex++] = array[left++]; } else { temp[tempIndex++] = array[center++]; } } while (left <= mid) { temp[tempIndex++] = array[left++]; } while (center <= right) { temp[tempIndex++] = array[center++]; } while (tempLeft <= right) { array[tempLeft] = temp[tempLeft++]; } printArray("第" + time + "次循环排序结果: ", array); }
运行结果:
原数组: 6、3、2、8、0、9、7、1、5、4、
第1次循环排序结果: 3、6、2、8、0、9、7、1、5、4、
第2次循环排序结果: 2、3、6、8、0、9、7、1、5、4、
第3次循环排序结果: 2、3、6、0、8、9、7、1、5、4、
第4次循环排序结果: 0、2、3、6、8、9、7、1、5、4、
第5次循环排序结果: 0、2、3、6、8、7、9、1、5、4、
第6次循环排序结果: 0、2、3、6、8、1、7、9、5、4、
第7次循环排序结果: 0、2、3、6、8、1、7、9、4、5、
第8次循环排序结果: 0、2、3、6、8、1、4、5、7、9、
第9次循环排序结果: 0、1、2、3、4、5、6、7、8、9、
建议运行的时候用 6、3、2、8、0、9、7、1、5、4、 这个数组!