排序:归并排序

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

public static void mergeSort(int[] elements) {
	if(null == elements || 1 >= elements.length) {
		// do nothing
	} else {
		int[] temp = new int[elements.length];
		sort(elements, 0, elements.length-1, temp);
	}
}

private static void sort(int[] elements,int left,int right,int[] temp) {
	if(left < right) {
		int mid = (left + right) >> 1;
		sort(elements, left, mid, temp);
		sort(elements, mid+1, right, temp);
		merge(elements,left,mid,right,temp);
	}
}

private static void merge(int[] elements, int left, int mid, int right, int[] temp) {
	System.out.println("left="+left+",right="+right+",mid="+mid);

	int l = left;// 左数组指针
	int r = mid + 1;// 右数组指针
	int t = 0;// 临时数组指针
	while(l <=mid && r<=right) {
		if(elements[l] <= elements[r]) {
			temp[t++] = elements[l++];
		} else {
			temp[t++] = elements[r++];
		}
	}
	// 将左边剩余元素填充进temp中
	while(l <= mid) {
		temp[t++] = elements[l++];
	}
	// 将右边剩余元素填充进temp中
	while(r <= right) {
		temp[t++] = elements[r++];
	}
	t = 0;
	while(left <= right) {
		elements[left++] = temp[t++];
	}
	System.out.println("elements="+Arrays.toString(elements));
	System.out.println("------------------------------------------------");
}

测试代码:java

public static void main(String[] args) {
	int[] array = {82 ,31 ,29 ,71, 72, 42, 64, 5, 110};
	mergeSort(array);
}

结果:算法

left=0,right=1,mid=0
elements=[31, 82, 29, 71, 72, 42, 64, 5, 110]
------------------------------------------------
left=0,right=2,mid=1
elements=[29, 31, 82, 71, 72, 42, 64, 5, 110]
------------------------------------------------
left=3,right=4,mid=3
elements=[29, 31, 82, 71, 72, 42, 64, 5, 110]
------------------------------------------------
left=0,right=4,mid=2
elements=[29, 31, 71, 72, 82, 42, 64, 5, 110]
------------------------------------------------
left=5,right=6,mid=5
elements=[29, 31, 71, 72, 82, 42, 64, 5, 110]
------------------------------------------------
left=7,right=8,mid=7
elements=[29, 31, 71, 72, 82, 42, 64, 5, 110]
------------------------------------------------
left=5,right=8,mid=6
elements=[29, 31, 71, 72, 82, 5, 42, 64, 110]
------------------------------------------------
left=0,right=8,mid=4
elements=[5, 29, 31, 42, 64, 71, 72, 82, 110]
------------------------------------------------

 

 

参考博客:https://www.cnblogs.com/chengxiao/p/6194356.html数组

相关文章
相关标签/搜索