归并排序算法(java代码实现)

 归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(N*logN)。因为归并排序每次都是在相邻的数据中进行操作,所以归并排序在O(N*logN)的几种排序方法(快速排序,归并排序,希尔排序,堆排序)也是效率比较高的。

算法流程:

1、将一个数组拆分为两个,从中间点拆开,通过递归操作来实现一层一层拆分。

2、从左右数组中选择小的元素放入到临时空间,并移动下标到下一位置。

3、重复步骤2直到某一下标达到尾部。

4、将另一序列剩下的所有元素依次放入临时空间。

5、将临时空间的数据依次放入原数据数组。

public class MergerSort {
  public static int count=0;
	public static void mergersort(int[] data){
		sort(data, 0,data.length-1);
	}
	public static void sort(int[] data,int left,int right){
		//递归结束条件
		if (left>=right) {
			return;
		}
		//确定一个中心拆分点
		int center=(left+right)/2;
		//对中心拆分点的左边进行排序
		sort(data, left, center);
		//对中心拆分点的右边进行排序
		sort(data, center+1, right);
		//合并左右两边的元素
		merge(data,left,center,right);
		query(data);
		
	}
	
	public static void merge(int[] data,int left,int center,int right){
		//创建一个临时数组
		int[] temparr=new int[data.length];
		//左数组的第一个变量的索引
		int lindex=left;
		//右数组的第一个变量的索引
		int rindex=center+1;
		//临时数组的索引
		int index=left;
		//从左右数组中找出最小的元素依次放到临时数组中
		while (lindex<=center&&rindex<=right) {
			if (data[lindex]<=data[rindex]) {
				temparr[index]=data[lindex];
				index++;
				lindex++;
			}
			else {
				temparr[index]=data[rindex];
				index++;
				rindex++;
			}
		}
		//将左数组还没放进去的元素放入临时数组
		while (lindex<=center) {
			temparr[index]=data[lindex];
			index++;
			lindex++;
		}
		//将右数组还没放进去的元素放入临时数组
		while (rindex<=right) {
			temparr[index]=data[rindex];
			index++;
			rindex++;
		}
		//将临时数组的值复制到原数组中
		index=left;
		while (index<=right) {
			data[index]=temparr[index];
			index++;
		}
		
	}
	
	
	
	public static void main(String[] args) {
     int[] data={5,9,1,4,7,0,8,3,6,2};
     query(data);
     mergersort(data);
     query(data);
	}

	public static void query(int[] data){
		System.out.print("第"+count+"次排序: ");
		count++;
		for(int i=0;i<data.length;i++){
			System.out.print(data[i]+" ");
		}
		System.out.println();	
	}
}

排序结果为:

第0次排序: 5 9 1 4 7 0 8 3 6 2 
第1次排序: 5 9 1 4 7 0 8 3 6 2 
第2次排序: 1 5 9 4 7 0 8 3 6 2 
第3次排序: 1 5 9 4 7 0 8 3 6 2 
第4次排序: 1 4 5 7 9 0 8 3 6 2 
第5次排序: 1 4 5 7 9 0 8 3 6 2 
第6次排序: 1 4 5 7 9 0 3 8 6 2 
第7次排序: 1 4 5 7 9 0 3 8 2 6 
第8次排序: 1 4 5 7 9 0 2 3 6 8 
第9次排序: 0 1 2 3 4 5 6 7 8 9 
第10次排序: 0 1 2 3 4 5 6 7 8 9 

猜你喜欢

转载自blog.csdn.net/qq_39404258/article/details/81872141