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();
}
}
归并排序
最新推荐文章于 2024-08-12 19:32:44 发布