归并排序(递归实现)

只是补个欠账…
在这里插入图片描述在这里插入图片描述
注意:

  • 树形结构切分到回复,时间复杂度一般为O(nlogn)
  • 递归的归并排序,最大时间复杂度=平均时间复杂度=O(nlogn)
  • 递归的归并排序是按照深度优先在树上进行的。

伪码描述:

MERGE_SORT(A,p,r)
	//p<r时,至少还有两个数字。
	//当元素个数为偶数,即p+r为奇数时,(p+r)/2落在中线之前的那个元素。
	if p<r then q<--(p+r)/2
	//分解过程
	MERGE-SORT(A,p,q)
	MERGE-SORT(A,q+1,r)
	//合并过程
	MERGE(A,p,q,r)
MERGR(A,p,q,r)
	n1<--q-p+1;n2<--r-q  //n1为左半部分元素个数,m2为右半部分元素个数
	create arrays L[1..n1] and R[1..n2]
	for i<--1 to n1 do L[i]<--A[p+i-1]
	for j<--1 to n2 do R[j]<--A[q+j]
	i<--1;j<--1
	for k<--p to r
		do if L[i]<=R[j]
			then A[k] == L[i]
				i<--i+1
			else A[k] == R[j]
				j<--j+1

递归实现:

import java.util.Scanner;
public class 归并递归实现 {
	static void merge(int a[],int lb,int mid,int ub) {
		int n1 = mid-lb+1;
		int n2 = ub - mid;
		int L[]=new int[n1+1];
		int R[]=new int[n2+1];
		for(int i=0;i<n1;i++) {
			L[i]=a[lb+i];
		}
		for(int i=0;i<n2;i++) {
			R[i]=a[mid+1+i];
		}
		L[n1]=R[n2]=Integer.MAX_VALUE;
		int i=0,j=0;
		for (int k=lb;k<=ub;k++) {
			if(L[i]<=R[j]) {
				a[k]=L[i];
				i++;
			}else {
				a[k]=R[j];
				j++;
			}
		}
	}
	static void mergeSort(int a[],int lb,int ub) {
		if(lb<ub) {
			int mid=(lb+ub)/2;
			mergeSort(a,lb,mid);
			mergeSort(a, mid+1, ub);
			merge(a,lb,mid,ub);
		}
	}
	public static void main(String args[]) {
		Scanner sc=new Scanner(System.in);
		int a[]=new int[100];
		int k=sc.nextInt();
		for(int i=0;i<k;i++) {
			a[i]=sc.nextInt();
		}
		mergeSort(a, 0, k-1);
		for(int i=0;i<k;i++) {
			System.out.println(a[i]);
		}
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
归并排序是一种经典的排序算法,它通过将待排序的数组分成两个子数组,分别对子数组进行排序,然后将两个已排序的子数组合并成一个有序的数组。递归实现归并排序的常用方法之一。 在Java中,可以使用递归实现归并排序。下面是一个简单的示例代码: ```java public class MergeSort { public static void mergeSort(int[] arr, int left, int right) { if (left < right) { int mid = (left + right) / 2; mergeSort(arr, left, mid); // 对左半部分进行归并排序 mergeSort(arr, mid + 1, right); // 对右半部分进行归并排序 merge(arr, left, mid, right); // 合并左右两个已排序的子数组 } } public static void merge(int[] arr, int left, int mid, int right) { int n1 = mid - left + 1; int n2 = right - mid; int[] L = new int[n1]; int[] R = new int[n2]; for (int i = 0; i < n1; ++i) { L[i] = arr[left + i]; } for (int j = 0; j < n2; ++j) { R[j] = arr[mid + 1 + j]; } int i = 0, j = 0; int k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } public static void main(String[] args) { int[] arr = { 5, 2, 8, 3, 1, 6 }; mergeSort(arr, 0, arr.length - 1); for (int num : arr) { System.out.print(num + " "); } } } ``` 以上代码中,`mergeSort`方法是归并排序的入口,它接收一个待排序的数组以及数组的左右边界。在每一次递归调用中,将数组分成两半,并对左右两半分别进行归并排序。最后,调用`merge`方法将两个已排序的子数组合并成一个有序的数组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值