归并排序

来源:互联网 发布:阿里云 黑洞中 编辑:程序博客网 时间:2024/06/03 19:06
package graph;public class Main {public void 非递归归并排序(int[] arr){int tmpIndex,leftMin,leftMax,rightMin,rightMax;int[] tempArr = new int[arr.length];//i为步长:1,2,4,8...for(int i=1;i<arr.length;i*=2){//按步长对每两个分组进行合并for(leftMin=0;leftMin<arr.length-i;leftMin=rightMax){tmpIndex = 0;leftMax = rightMin= leftMin+i;rightMax = rightMin+i;if(rightMax > arr.length){rightMax = arr.length;}while(leftMin<leftMax&&rightMin<rightMax){if(arr[leftMin] < arr[rightMin]){tempArr[tmpIndex++] = arr[leftMin++];}else{tempArr[tmpIndex++] = arr[rightMin++];}}//若右边挑选完并加入到tempArr中了,把左边没挑选完了搬到右边的末尾while(leftMin<leftMax){arr[--rightMin] = arr[--leftMax];}//将排好序的tempArr覆盖回原数组while(tmpIndex > 0){arr[--rightMin] = tempArr[--tmpIndex];}}}}public void 归并排序(int start, int end, int[] arr) {if (start < end) {int mid = (end + start) / 2;//分治策略,整个数组一分为二,分到1个元素为止归并排序(start, mid, arr);归并排序(mid + 1, end, arr);//一半一半再一半地入栈,合并时弹栈合并回去归并合并(arr, start, end);}}private void 归并合并(int[] arr, int start, int end) {int[] tempArr = new int[end - start + 1];int k = 0;int tempStart = start;int mid = (start + end) / 2;int tempEnd = mid + 1;while (tempStart <= mid && tempEnd <= end) {if (arr[tempStart] < arr[tempEnd]) {tempArr[k++] = arr[tempStart++];} else {tempArr[k++] = arr[tempEnd++];}}while (tempStart <= mid) {tempArr[k++] = arr[tempStart++];}while (tempEnd <= end) {tempArr[k++] = arr[tempEnd++];}for(int i=0;i<tempArr.length;i++){arr[i+start] = tempArr[i];}}public static void main(String[] args) {Main m = new Main();int[] arr = {5,3,1,2,4};m.非递归归并排序(arr);System.out.println();}}

1 0