歸併排序

歸併排序思路:

1、將n個元素分成各含n/2個元素的子序列

2、然後對兩個子序列進行遞歸的排序

3、最後將兩個已排序的子序列進行合併得到最終的排序結果

 

public static int[] arr;
	
	public static void main(String[] args) {
		
		int[] A = {5,8,9,11,2,5,4,3};
		arr = new int[A.length];
		
		mergeSort(A, 0, A.length-1);
		
		for (int i = 0; i < A.length; i++) {
			System.out.print(A[i]+" ");
		}
		
	}
	
	//歸併排序
	public static void mergeSort(int[] A,int p,int r)
	{
		if(p<r)
		{
			int mid = p+(r-p)/2;
			mergeSort(A, p, mid);   //左側歸併排序
			mergeSort(A, mid+1, r);	//右側歸併排序
			merger(A,p,mid,r);      //兩側合併
		}
	}
	
	
	//合併
	public static void merger(int[] A,int p, int mid, int r)
	{
		//輔助空間arr
		for(int i = 0;i<A.length;i++)
		{
			arr[i] = A[i];
		}
		
		int left = p; //左側隊伍的頭部指針
		int right = mid+1; //右側隊伍的頭部指針
		int current = p; //原數組A的頭指針
		
		//左側隊伍和右側隊伍都沒走到底的情況
		while(left <=mid && right<=r)
		{
			if(arr[left]<=arr[right])
			{
				A[current] = arr[left];
				current++;
				left++;
			}else
			{
				A[current] = arr[right];
				current++;
				right++;
			}
		}
		
		//說明左側隊伍還沒有走完
		while(left <=mid)
		{
			A[current] = arr[left];
			current++;
			left++;
		}
	}

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