《算法导论》学习心得(三)—— 归并排序(Java)
2014-11-07 10:49
351 查看
源码下载。看书看到第二部分了——排序,排序的算法主要有插入排序,归并排序,冒泡排序,堆排序,快速排序,计数排序,基数排序和桶排序,本文就先讲插入排序,归并排序和冒泡排序。
冒泡排序——它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。一种非常简单的排序算法,代码如下:
插入排序——的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
之前我一直很不理解插入排序和冒泡排序的区别,如果大家和我有同样的疑惑就看http://blog.csdn.net/mfcdestoryer/article/details/7025273,讲的挺好。
归并排序——归并排序主要是完成将若干个有序子序列合并成一个完整的有序子序列;自底向上的排序是归并排序的一种实现方式,将一个无序的N长数组切个成N个有序子序列,然后再两两合并,然后再将合并后的N/2(或者N/2
+ 1)个子序列继续进行两两合并,以此类推得到一个完整的有序数组。下图详细的分解了自底向上的合并算法的实现过程:引自:/article/2701790.html
代码如下:
冒泡排序——它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。一种非常简单的排序算法,代码如下:
/* * 冒泡排序 */ 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)个子序列继续进行两两合并,以此类推得到一个完整的有序数组。下图详细的分解了自底向上的合并算法的实现过程:引自:/article/2701790.html
代码如下:
/** *归并排序 *@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; }
相关文章推荐
- 《算法导论》学习心得(五)—— 快排(Java)
- 《算法导论》学习心得(八)—— 桶排序(JAVA)
- 《算法导论》学习心得(四)—— 堆排序(Java)
- 《算法导论》学习心得(六)—— 计数排序(Java)
- 《算法导论》学习心得(十)—— 泛型(JAVA)
- 《算法导论》学习心得(九)——栈(JAVA)
- 《算法导论》学习心得(十一)—— 队列(JAVA)
- JAVA 学习心得_备忘而已!
- Java容器类学习心得
- java学习心得
- java学习心得体会
- 终于在csdn上安家了!这个博客将作为我学习java历程,记录我心得的一个地方
- Java异常学习心得
- Java容器类学习心得
- JAVA学习心得--继承、接口与泛型
- JAVA学习心得--线程
- JAVA学习心得--基础知识
- Java数组学习心得
- think in java3学习心得之——Reusing class
- 学习java心得体会(一)