浅谈二路归并排序

二路归并排序:

把待排序序列分为两个子序列,对每个子序列分别进行二路归并排序,再把有序的两个子序列合并为整体有序序列。

public static void mergeSort(int[] nums, int low, int high) {
	int mid = (low + high) / 2;
	if (low < high) {
      	mergeSort(nums, low, mid); // 左边归并排序
     	mergeSort(nums, mid + 1, high); // 右边归并排序
      	merge(nums, low, mid, high); // 左右两边归并为有序序列
 	}
}

public static void merge(int[] nums, int low, int mid, int high) {
	int[] temp = new int[high - low + 1]; // 定义一个新数组存储归并结果
  	int i = low; // 左指针
  	int j = mid + 1; // 右指针
   	int k = 0;
	// 将左边和右边对应位置的数比较,较小的先移到新数组中
	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 p = 0; p < temp.length; p++) 
    	nums[p + low] = temp[p];
}

最好时间复杂度:O(nlogn)

最坏时间复杂度:O(nlogn)

平均时间复杂度:O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值