合并排序Merge Sort是一种有效的排序算法,最坏情况运行时间为Θ(nlgn)。用到了分治法以及递归思想,下面先对这两者做简单介绍。
分治法(divide and conquer),无论 从汉语还是英文字面上,你都能轻易理解它的意思,把大问题分解成小问题,然后一个一个治理解决,
各个击破!
递归(recurrence):就是方法可以不停的调用自己,一层一层进行下去,直到条件不满足 跳出。递归是一种很有用的思想,对于解决某些
复杂问题很有效果,比如汉诺塔问题。递归思想对于新手来说可能理解起来比较费力,大家多多看书钻研,认真领会。
合并排序,首先将数组分为左右两组;其次递归操作,直到每一个元素都是一个小组;最后对对应的小组合并操作,合并后的数组 便是
按照从小到大顺序排列的。
合并排序也可以用打牌的过程来说明,假设桌面上朝上放着两摞已经排好序的牌,现在要将这两摞已排好序的牌合成一摞,首先,取两摞中
位于最上面的两张中最小的一张,将其取出后面朝下地放到输出堆中。重复这个步骤 ,直到某一输入堆为空时为止。这时把输入堆中余下的牌面朝
下地放入输出堆即可。
Java代码:
public class MergeSort{ public void merge_sort(int[] nums,int start,int end){ if (start < end) { int middle = (start + end)/2; merge_sort(nums,start,middle); merge_sort(nums,middle+1,end); merge(nums,start,middle,end); } } private void merge(int[]nums,int start,int middle,int end){ int i = start; int j = middle + 1; int [] temp = new int[nums.length]; int index = start; while (i<=middle && j<=end) { if (nums[i] < nums[j]) { temp[index++] = nums[i++]; }else { temp[index++] = nums[j++]; } } while (i<=middle) { temp[index++] = nums[i++]; } while (j<=end) { temp[index++] = nums[j++]; } for (int n=start; n<=end; n++) { nums[n] = temp[n]; } } public static void main(String[] args){ MergeSort tester = new MergeSort(); int [] nums = {13,04,-54,5,88,54,2,0,42}; tester.merge_sort(nums,0,nums.length-1); for (int i=0; i<nums.length; i++) { System.out.print(nums[i] + " "); } } }