《算法导论》学习心得(三)—— 归并排序(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;
	}


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