归并算法(Java实现)

1、归并算法的概念:

归并排序是一种概念上最简单的排序算法,与快速排序一样,归并排序也是基于分治法的。归并排序将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后再将他们合并成一个子序列。合并两个子序列的过程也就是两路归并。

2、归并算法的流程:

归并算法(Java实现)_第1张图片

3、归并算法分析:

归并算法主要是先将原数组通过递归调用进行分割,使之形成一个个独立的数组,之后借助temp数组,将数组进行合并,注意合并时,从栈顶向栈底方向。

4、代码实现:

import java.util.Arrays;
//归并排序,使用temp这一个额外的数组来合并merge的数组,并将其多次赋值给array,知道合并完成时,temp内的数组序列才与array内的一致。
public class mergeSort {
	public static void main(String[] args) {
	int[] array= {8,4,5,7,1,3,6,2};
	int[] temp = new int[array.length];
	sort(array,0,array.length-1,temp);
	System.out.println(Arrays.toString(array));
	}
	//分割数组
	public static void sort(int[] array,int left,int right,int[] temp) {
		if(left<right) {
			int mid = (left+right)/2;
			sort(array,left,mid,temp);//向左将array进行分割
			sort(array,mid+1,right,temp);//向右将array进行分割
			merge(array,left,mid,right,temp);//调用是将分割好的数组从栈顶到栈底开始往下合并
		}
	}
	//合并数组
	public static void merge(int[] array,int left,int mid,int right,int[] temp) {
		int i = left;//初始化i,左边有序序列的初始索引
		int j = mid+1;//初始化j,右边序列的初始索引
		int t = 0;//指向temp数组的当前索引
		while(i<=mid&&j<=right) {
			if(array[i]<=array[j]) {
				temp[t] = array[i];
				t+=1;
				i+=1;
			}
			else {
				temp[t] = array[j];
				t+=1;
				j+=1;
			}
		}
		while(i<=mid) {
			temp[t] = array[i++];
			t++;
		}
		while(j<=right) {
			temp[t] = array[j++];
			t++;
		}
		int templeft = left;
		t = 0;
		//将temp内的数组赋值给array数组
		while(templeft<=right) {
			array[templeft] = temp[t];
			templeft++;
			t++;
		}
	}
}

5、输出:

[1, 2, 3, 4, 5, 6, 7, 8]

你可能感兴趣的:(Java,算法,Java,数据结构)