排序算法-歸併排序(Java)

歸併排序

歸併排序是利用歸併的思想實現的排序方法,該算法採用經典的分治策略(分治法將問題分成一些小的問題然後遞歸求解,而治的階段則將分的階段得到的個答案修補在一起,即分而治之)
簡單圖解
在這裏插入圖片描述
再來看看治階段,我們需要將連個已經有序的子序列合併成一個有序序列
合併相鄰有序子序列示意圖(最後一次合併的示意圖)
在這裏插入圖片描述
代碼如下

	//分+合的方法
	public static void mergeSort(int [] arr,int left,int right,int [] temp){
		if(left < right){
			int mid = (left + right) / 2;
			//需要注意向左和向右的left/right的條件
			mergeSort(arr,left,mid,temp);//左遞歸分解
			mergeSort(arr,mid,right,temp);//右遞歸分解
			merge(arr,left,mid,right,temp);//合併排序
		}
	}
	//合併的方法
	public static void merge(int [] arr,int left,int mid,int right,int [] temp){
		int i = left;//初始化i,左邊有序序列的初始索引
		int j = mid + 1;//初始化j,右邊有序序列的初始索引
		int t = 0;//指向temp數組的當前索引
		//將左右兩端有序序列填充到temp中,直到一端添加完畢
		while(i <= mid && j<= right){
			if(arr[i] <= arr[j]){
				temp[t] = arr[i];
				t++;
				i++; 
			}else{
				temp[t] = arr[j];
				t++;
				i++;
			}
		}
		//把剩餘數據的一邊的數據依次填充到temp
		while(i <= mid){
			temp[t] = arr[i];
			i++;
			t++;
		}
		while(j <= right){
			temp[t] = arr[j];
			j++;
			t++;
		}
		//將temp數組數據拷貝到原始數組中
		t= 0;
		int tempLeft = left;
		while(tempLeft < right){
			arr[tempLeft] = arr[t];
			t++;
			tempLeft++;
		}
		
	}

建議Debug跟代碼,更容易理解起來,遞歸還是稍微有點不好理解的

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