归并排序以及注释讲解

归并排序代码实现

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++];
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静波波呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值