归并排序代码实现
public class GuiBing{
public static void main(String[] args){
int[] a = {4, 1, 3, 2};
int[] temp = new int[a.length];
mergeSort(a, 0, a.length - 1, temp);
for(int i = 0; i < a.length; i++){
System.out.print(a[i] + " ");
}
}
//分+合方法
public static void mergeSort(int[] a, int left, int right, int [] temp){
if(left < right){
int mid = (left + right) / 2;
//向左递归进行分解
mergeSort(a, left, mid, temp);
//向右递归进行分解
mergeSort(a, mid + 1, right, temp);
//合并
merge(a, left, mid, right, temp);
}
}
//合并的方法
public static void merge(int[] a, int left, int mid, int right, int[] temp){
int i = left;//i表示左边有序序列的初始下标
int j = mid + 1;//j表示右边有序序列的初始下标
int t = 0;//t表示temp临时数组的当前下标
//①先把左右两边(已经有序)的数据按照规则填充到temp数组
//直到左右两边的有序序列,有一边处理完毕为止
while(i <= mid && j <= right){
//如果左边的有序序列的当前元素,小于等于右边序列的当前元素
//那么就把左边的有序序列的当前元素拷贝到temp数组中
if(a[i] <= a[j]){
temp[t] = a[i];
i++;
t++;
}else if(a[j] < a[i]){
temp[t] = a[j];
j++;
t++;
}
}
//②把有剩余数据的一边的数据一次全部填充到temp
while(i <= mid){
temp[t] = a[i];
i++;
t++;
}
while(j <= right){
temp[t] = a[j];
j++;
t++;
}
//③将temp数组的元素拷贝到 a
//注意:并不是每次都拷贝所有!!!
t = 0;
int tempLeft = left;//其实直接用left就可以
while(tempLeft <= right){
a[tempLeft] = temp[t];
t++;
tempLeft++;
}
}
}
或者也可以这样写:
public class GuiBing{
public static void main(String[] args){
int[] nums = {4, 1, 3, 2};
mergeSort(nums, 0, nums.length - 1);
for(int i = 0; i < nums.length; i++){
System.out.print(nums[i] + " ");
}
}
public static void mergeSort(int[] nums, int left, int right){
if(right > left){
int mid = (left + right) / 2;
mergeSort(nums, left, mid);
mergeSort(nums, mid + 1, right);
merge(nums, left, mid, right);
}
}
public static void merge(int[] nums, int left, int mid, int right){// 将nums[left...right]区间内的元素排成有序的
int[] temp = new int[right - left + 1];
int t = 0;
int i = left;
int j = mid + 1;
while(i <= mid && j <= right){
if(nums[i] > nums[j]){
temp[t++] = nums[j++];
}else {
temp[t++] = nums[i++];
}
}
while(i <= mid){
temp[t++] = nums[i++];
}
while(j <= right){
temp[t++] = nums[j++];
}
t = 0;
while(left <= right){
nums[left++] = temp[t++];
}
}
}