歸併排序-java版

1. 歸併排序

1.1 歸併排序的基本介紹

利用分治思想,將問題分成一些小的問題,然後遞歸求解

1.2 歸併排序思想

在這裏插入圖片描述

1.3 歸併排序的時間複雜度和空間複雜度等

算法名稱 平均時間複雜度 最好情況 最壞情況 空間複雜度 穩定性
歸併排序 O(nlogn) O(nlogn) O(nlogn) O(n) 穩定

2. 代碼演示

/**
 * @author shengjk1
 * @date 2020/4/11
 */
public class MergetSort {
	public static void main(String[] args) {
		int arr[] = {8, 4, 5, 7, 1, 3, 6, 2};
		int[] temp = new int[arr.length];
		mergeSort(arr, 0, arr.length - 1, temp);
		System.out.println(Arrays.toString(arr));
		
	}
	
	
	public static void mergeSort(int[] arr, int left, int right, int[] temp) {
		if (left < right) {
			System.out.println("mergerSort left:" + left + " right:" + right);
			int mid = (left + right) / 2;
			//向左遞歸
			mergeSort(arr, left, mid, temp);
			//向右遞歸
			mergeSort(arr, mid + 1, right, temp);
			//合併
			merge(arr, left, mid, right, temp);
		}
	}
	
	/**
	 * @param arr   原始數組
	 * @param left  要合併的數組的最左邊
	 * @param mid   要合併的數組的中間
	 * @param right 要合併數組的最右邊
	 * @param temp  臨時數組
	 */
	public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
		System.out.println("merge    left:" + arr[left] + " right:" + arr[right]);
		//左邊有序序列的初始索引
		int i = left;
		//右邊有序序列的初始索引
		int j = mid + 1;
		//指向 temp 數組的當前索引
		int t = 0;
		
		//(一)
		//先把左右兩邊有序數據按照規則填充到 temp 數組中
		//知道左右兩邊的有序序列,有一邊處理完畢爲止
		while (i <= mid && j <= right) {
			//如果左邊的有序序列的當前元素小於等於右邊有序序列的當前元素
			//即將左邊的當前元素填充到 temp 數組
			//然後自增
			if (arr[i] <= arr[j]) {
				temp[t] = arr[i];
				t++;
				i++;
			} else {
				temp[t] = arr[j];
				t++;
				j++;
			}
			
		}
		
		/*
		(二)
		把剩餘數據的一邊的數據依次全部填充到 temp 中
		 */
		while (i <= mid) {
			temp[t] = arr[i];
			t++;
			i++;
		}
		
		while (j <= right) {
			temp[t] = arr[j];
			t++;
			j++;
		}
		
		/*
		(三)
		將 temp 數組的元素拷貝到 arr
		注意,並不是每次都拷貝所有
		 */
		t = 0;
		int tempLeft = left;
		while (tempLeft <= right) {
			arr[tempLeft] = temp[t];
			t++;
			tempLeft++;
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章