《算法導論》學習心得(三)—— 歸併排序(Java)

       源碼下載。看書看到第二部分了——排序,排序的算法主要有插入排序,歸併排序,冒泡排序,堆排序,快速排序,計數排序,基數排序和桶排序,本文就先講插入排序,歸併排序和冒泡排序。

冒泡排序——它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。一種非常簡單的排序算法,代碼如下:

/*
	 * 冒泡排序
	 */
	static int[] bubbleSort(int [] arrayay)
	{
		int arrayayLength = arrayay.length;
		int temp;
		for(int i=0;i<arrayayLength;i++)
		{
			for(int j=0;j<arrayayLength-i-1;j++)
			{
				if(arrayay[j]>=arrayay[j+1])
				{
					temp = arrayay[j+1];
					arrayay[j+1]=arrayay[j];
					arrayay[j]=temp;
				}

			}
		}
		return arrayay;
	}

插入排序——的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到O(1)的額外空間的排序),因而在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,爲最新元素提供插入空間。

/**
	 *插入排序
	 *@paramarray
	 *@return
	 */
	private static int[] insertSort(int[] array)
	{
		for(int i=1;i<array.length;i++){
			for(int j=i;j>0;j--){
				if(array[j]<array[j-1]){
					int temp=array[j];
					array[j]=array[j-1];
					array[j-1]=temp;
				}else{
					//接下來是無用功
					break;
				}
			}
		}
		return array;
	}

之前我一直很不理解插入排序和冒泡排序的區別,如果大家和我有同樣的疑惑就看http://blog.csdn.net/mfcdestoryer/article/details/7025273,講的挺好。

歸併排序——歸併排序主要是完成將若干個有序子序列合併成一個完整的有序子序列;自底向上的排序是歸併排序的一種實現方式,將一個無序的N長數組切個成N個有序子序列,然後再兩兩合併,然後再將合併後的N/2(或者N/2 + 1)個子序列繼續進行兩兩合併,以此類推得到一個完整的有序數組。下圖詳細的分解了自底向上的合併算法的實現過程:引自:http://blog.csdn.net/cjf_iceking/article/details/7920153

代碼如下:

/**
	 *歸併排序
	 *@param array
	 *@return
	 */
	private static int[] mergeSort(int[] array,int beginIndex,int endIndex)
	{
		int mediumIndex=0;
		if(beginIndex<endIndex)
		{
			mediumIndex = (endIndex+beginIndex)/2;
			mergeSort(array,beginIndex,mediumIndex);
			mergeSort(array, mediumIndex+1, endIndex);
			merge(array, beginIndex, mediumIndex, endIndex);
		}
		return array;
	}
	private static int[] merge(int [] array,int low,int mid,int high)
	{
		int[] temp = new int[high - low + 1];  
		int i = low;// 左指針  
		int j = mid + 1;// 右指針  
		int k = 0;
		// 把較小的數先移到新數組中  
		while (i <= mid && j <= high) {  
		    if (array[i] < array[j]) {  
		        temp[k++] = array[i++];  
		    } else {  
		        temp[k++] = array[j++];  
		    }  
		}
		// 把左邊剩餘的數移入數組  
		while (i <= mid) {  
		    temp[k++] = array[i++];  
		}
		// 把右邊邊剩餘的數移入數組  
		while (j <= high) {  
		    temp[k++] = array[j++];  
		}
		// 把新數組中的數覆蓋nums數組  
		for (int k2 = 0; k2 < temp.length; k2++) {  
			array[k2 + low] = temp[k2];  
		}
		return array;
	}


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