归并排序算法笔记

来源:互联网 发布:苏州大学网络网上缴费 编辑:程序博客网 时间:2024/06/05 20:58

1,思想:采用先化整为零,然后合零为整的思想。即先把序列一分为二,再把子序列一分为二,依次下去直到不能再分割即到子序列只有一个元素。最后将分割的子序列使用合并排序。

2,效率:空间复杂度加倍;时间复杂度为N*logN,与快速排序,基数排序相同。

3,Java代码的递归实现:


public class MergeSorter {public static void mergeSort(int[] array) {int[] workArray = new int[array.length];recMergeImpl(workArray, array, 0, array.length - 1);}private static void recMergeImpl(int[] workArray, int[] array, int left,int right) {if (left == right) {return;// just have one element,return from recusive.}int mid = (left + right) / 2;recMergeImpl(workArray, array, left, mid);recMergeImpl(workArray, array, mid + 1, right);merge(workArray, array, left, mid, right);}/** * merge two child seq. *  * @param workArray * @param array * @param leftPtr * @param rightPtr * @param rightBound */private static void merge(int[] workArray, int[] array, int left, int mid,int right) {int j = 0;int leftPtr = left;int rightPtr = mid + 1;while (leftPtr <= mid && rightPtr <= right) {if (array[leftPtr] < array[rightPtr])workArray[j++] = array[leftPtr++];// copy element to work array.elseworkArray[j++] = array[rightPtr++];// copy element to work// array.}while (leftPtr <= mid) {// right finish,but left still left element.workArray[j++] = array[leftPtr++];}while (rightPtr <= right) {// left finish,but right still left element.workArray[j++] = array[rightPtr++];}int workElementsLen = right - left + 1;for (j = 0; j < workElementsLen; j++) {// copy workArray sorted element// to source array.array[left + j] = workArray[j];}}}


0 0
原创粉丝点击