import java.util.Arrays;
public class MergeSort非递归 {
public static void main(String[] args) {
int[] arr = {7,10,4,2,9,6,100,70,50,22,13,11,19,900};
Merge_Sort(arr);
System.out.println(Arrays.toString(arr));
}
/*
* @temp 数组用于存储调序后的arr
*/
public static void Merge_Sort( int[] arr ){
int[] temp = new int[arr.length];
if( temp != null ){
for( int gap = 1; gap < arr.length; gap *= 2 ){
int i;
for( i = 0; i <= arr.length-2*gap; i += 2*gap )
merge( arr, temp, i, i+2*gap-1);
if( i+gap < arr.length ) //归并最后两个子列
merge( arr, temp, i, arr.length-1);
else //最后只剩一个子列时
for( int j =i; j < arr.length; j++ )
temp[j] = arr[j];
}
}
}
/*
* 合并函数
* @mid_L 左侧子数组的右下标
* @mid_R 右侧子数组的左下标
*/
public static void merge(int[] arr, int[] temp, int left, int right ){
int mid_L = (left + right) / 2;
int mid_R = mid_L + 1;
int cur = left;
int len = right - left + 1;
while( left <= mid_L && mid_R <= right ){
if( arr[left] <= arr[mid_R])
temp[cur++] = arr[left++];
else
temp[cur++] = arr[mid_R++];
}
while( left <= mid_L )
temp[cur++] = arr[left++];
while( mid_R <= right ){
temp[cur++] = arr[mid_R++];
}
for( int i = 0; i < len; i++,right--){
arr[right] = temp[right];
}
}
}
归并排序非递归
最新推荐文章于 2022-02-27 19:30:59 发布