思想:先把一个待排序的数组分解成两个,再把两个分解成4个。。。。然后再合并排序。
package ArrayPackage;
import java.util.Arrays;
public class MergeSort1 {
public static void main(String[] args) {
int[] nums = { 2, 7, 6, 9, 0, 5, 4 };
sort(nums, 0, nums.length - 1);
System.out.println(Arrays.toString(nums));
}
//分解数组
public static int[] sort(int[] nums, int low, int high) {
int mid = (low + high) / 2;
if (low < high) {
sort(nums, low, mid);
sort(nums, mid + 1, high);
merge(nums, low, mid, high);
}
return nums;
}
/**
*
* @Title: merge 合并
* @Description: TODO
* @param @param nums需要合并排序的数组
* @param @param low 数组的左指针
* @param @param mid 数组的中间指针
* @param @param high数组的右指针
* @return void
* @author Administrator
* @date 2017-2-20
* @throws
*/
public static void merge(int[] nums, int low, int mid, int high) {
int[] temp = new int[high - low + 1];//temp是一个临时数组,用来存放合并的序列
int i = low;// i是第一段序列的下标
int j = mid + 1;//j是第二段序列的下标
int k = 0;//k是临时存放合并序列的下标
while (i <= mid && j <= high) {//扫描第一段序列和第二段序列,直到有一个扫描结束
if (nums[i] < nums[j]) {//判断第一段和第二段序列,哪一个小将哪一个存入到临时数组中,并继续向下扫描
temp[k++] = nums[i++];
} else {
temp[k++] = nums[j++];
}
}
while (i <= mid) {//若第一段还没有扫描完,将其全部复制到合并序列
temp[k++] = nums[i++];
}
while (j <= high) {//若第二段还没有扫描完,将其全部复制到合并序列
temp[k++] = nums[j++];
}
for (int a = 0; a < temp.length; a++) {
nums[a + low] = temp[a];//将合并的序列复制到原始序列中
}
}
}