排序:歸併排序

        歸併排序(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數組

相關文章
相關標籤/搜索