排序整理——归并排序

       归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

       基本原理:通过对若干个有序结点序列的归并来实现排序。 所谓归并是指将若干个已排好序的部分合并成一个有序的部分。

package sort;

import java.util.Arrays;

/**
 * 
* Title: MergeSort 
* Description: 将若干个已排好序的部分合并成一个有序的部分。
* @author Marmara  
* @date 2018年9月23日
 */
public class MergeSort {

	public static void main(String[] args) {
		int a[]= {42,15,20,6,8,38,50,12};
		System.out.println("原数组为:"+Arrays.toString(a));
		sort(a);
		System.out.println("排序后为:"+Arrays.toString(a));
	}
	public static void sort(int a[]) {
		//判断原数组是否为空
		if(a.length>0) {
			//建立一个和原数组同长度的临时数组,以免频繁开辟空间
			int t[]=new int[a.length];
			sort(a, 0, a.length-1, t);
		}
	}
	private static void sort(int a[],int left,int right,int t[]) {
		if(left<right) {
			int mid=(left+right)/2;
			sort(a, left, mid, t);//左序列排序
			sort(a, mid+1, right, t);//右序列排序
			merge(a, left, mid, right, t);//整合排序
		}
	}
	private static void merge(int a[],int left,int mid,int right,int[]t) {
		//给左序列、右序列以及临时数组设定指针
		int i=left;
		int j=mid+1;
		int t1=0;
		
		while(i<=mid&&j<=right) {
			if(a[i]<=a[j]) {
				t[t1++]=a[i++];
			}else {
				t[t1++]=a[j++];
			}	
		}
		//把左、右序列的剩余元素填充到临时数组中
		while(i<=mid) {
			t[t1++]=a[i++];
		}
		while(j<=right) {
			t[t1++]=a[j++];
		}
		t1=0;
		//把临时数组中的元素存到原数组中
		while(left<=right) {
			a[left++]=t[t1++];
		}
	}
	
}

运行结果为:

猜你喜欢

转载自blog.csdn.net/Marmara01/article/details/82825666