归并排序(Java)

归并排序(Java)

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

  • 时间复杂度:O(nlog 2 n)
  • 稳定性:稳定
  • 实质:将两个或两个以上的序列组合成一个新的有序表
图示

在这里插入图片描述
(图片来自:https://www.cnblogs.com/guoyaohua/p/8600214.html)

代码如下

public class Mergesort {

	public static void main(String[] arrrgs) {
		int []arr= {49,38,65,97,76,13,27,49,55,4};
		mergeSort(arr,0,arr.length-1);
		System.out.print("归并排序的结果为:");
		for(int i=0;i<arr.length;i++) {//简写:for(int i:arr)
			System.out.print(arr[i]+" ");
		}
	}

	public static void mergeSort(int[] arr,int p,int r) {
		if (p < r){
		int q =(int)Math.floor((p+r)/2);
		mergeSort(arr,p,q); //将左半边排序
		mergeSort(arr,q+1,r); //将右半边排序
		Merge(arr,p,q,r); //归并结果
	}
}
	public static void Merge(int[] arr,int p,int q,int r){
		int n1 = q - p + 1;
		int n2 = r - q;
		int[] L = new int[n1 + 1];//L[1..n1+1], R[1..n2+1]是新的数组
		int[] R = new int[n2 + 1];
		for (int i = 0;i < n1;i++){
		L[i] = arr[p + i];
		}
		for (int j = 0;j < n2;j++){
		R[j] = arr[q + j + 1];
		}
		L[n1] = Integer.MAX_VALUE;
		R[n2] = Integer.MAX_VALUE;
		int i = 0,j = 0;
		for (int k = p;k <= r;k++){
		if (L[i] <= R[j]){
		arr[k] = L[i];
		i = i + 1;
		}else{
		arr[k] = R[j];
		j = j + 1;
		}
	  }
	}
}

运行结果
归并排序的结果为:4 13 27 38 49 49 55 65 76 97 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是归并排序Java代码实现: ```java public class MergeSort { public static void mergeSort(int[] arr, int left, int right) { if (left >= right) { return; } 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[] temp = new int[right - left + 1]; int i = left, j = mid + 1, k = 0; while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (int p = 0; p < temp.length; p++) { arr[left + p] = temp[p]; } } public static void main(String[] args) { int[] arr = {5, 1, 6, 3, 4, 2}; mergeSort(arr, 0, arr.length - 1); for (int i : arr) { System.out.print(i + " "); } } } ``` 归并排序的基本思想是将待排序的序列分成两部分,分别对两部分进行排序,然后将两部分合并成一个有序序列。在合并过程中,需要使用一个临时数组来存储合并结果。 具体实现过程中,首先找到待排序序列的中间位置,然后递归地对左半部分和右半部分进行排序,最后将左半部分和右半部分合并成一个有序序列。合并过程中,使用两个指针分别指向左半部分和右半部分的起始位置,比较两个指针所指的元素大小,将较小的元素存入临时数组中,并移动指针。最后将临时数组中的元素复制回原数组中。 以上是归并排序Java代码实现,希望能够帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值