Java_经典算法之归并排序

一、归并排序介绍

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

二、算法步骤

第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

第二步:设定两个"指针”,最初位置分别为两个已经排序序列的起始位置

第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤3直到某一指针超出序列尾

将另一序列剩下的所有元素直接复制到合并序列尾。如图所示:

三、代码以及测试

package com.rong.sort;

import java.util.Arrays;

public class MergeSortDemo {
	
	public static void main(String[] args) {
		int[] sourceArray = {4,21,13,1 ,7,15,9,26};
		System.out.println("====================排序前====================");
		for(int value:sourceArray) {
			System.out.print(value + "  ");
		}
		System.out.println();
		System.out.println();
		int[] sortArray = sort(sourceArray);
		System.out.println("====================排序后====================");
		for(int value:sortArray) {
			System.out.print(value + "  ");
		}
		System.out.println();
	}


	private static int[] sort(int[] sourceArray) {
		int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
		
		if(arr.length<2) {
			return arr;
		}
		
		int middle = (int) Math.floor(arr.length/2);
		
		int[] left = Arrays.copyOfRange(arr, 0, middle);
		int[] right = Arrays.copyOfRange(arr, middle, arr.length);
		
		return merge(sort(left),sort(right));
	}

	
	private static int[] merge(int[] left, int[] right) {
		
		int[] result = new int[left.length+right.length];
		int i=0;
		
		while(left.length>0 && right.length>0) {
			if(left[0] <= right[0]) {
				result[i++] = left[0];
				left = Arrays.copyOfRange(left, 1, left.length);
			}else {
				result[i++] = right[0];
				right = Arrays.copyOfRange(right, 1, right.length);
			}
		}
		
		
		while(left.length > 0) {
			result[i++] = left[0];
			left = Arrays.copyOfRange(left, 1, left.length);
		}
		
		while(right.length > 0) {
			result[i++] = right[0];
			right = Arrays.copyOfRange(right, 1, right.length);
		}
		return result;
	}

}

测试结果:

 

 

 

 

 

发布了60 篇原创文章 · 获赞 10 · 访问量 9186

猜你喜欢

转载自blog.csdn.net/chaseqrr/article/details/104278074