排序算法之归并排序
2017-07-25 10:36
169 查看
今天分享的算法是归并排序,排序有很多种算法
=====相关链接====
有对快速排序感兴趣的同学请点击锦绣谷传送门
有对堆排序感兴趣的同学请点击银月城传送门
进入我们今天的正题,首先引入概念
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
看个例子,如一个无序数组3,5,7,2,6,1,3,8,4
归并排序的策略是将有序的子序列合并,也就是说我们要把它拆成若干个子序列,也就是拆成
3,5|7,2|6,1|3,8|4 之后我们对有序的子序列进行合并,先对3,5|7,2进行合并
合并方法是判断两首尾两个指针指向数字的大小,例如上面的事例3<2所以在新的数组我们放入第一位2,然后旧数组2对应的指针左移,变为
之后继续比较两个指针所指数字的大小,肯定是取出3来,然后将3放入新数组的第二位,然后将3的指针右移,变为
此时在进行比较,取出5,将5放入新的数组的第三位,然后将5对应的指针右移,此时指针超出左边数组大小了,所以我们将右边数组剩余的数字全部补全在新数组最末尾,因此新数组是2,3,5,7
同样操作我们对6,1,3,8也进行一下归并,得到新的数组是1,3,6,8
然后在堆2,3,5,7和1,3,6,8进行排列,得到新的数组1,2,3,3,5,6,7,8
最后对1,2,3,3,5,6,7,8和4进行排列,得到最终数组1,2,3,3,4,5,6,7,8
这就是一个完整的归并排序,下面我们看代码
我们先调用mergeSort方法,里面递归调用mergeSort,目的在于把数组分成多个有序的小数组,然后调用mergeArray进行归并操作,得到最终数组
代码上面有详细的注释,可以根据上面的步骤对照看一下,如果有问题请留言,第一时间解答
=====相关链接====
有对快速排序感兴趣的同学请点击锦绣谷传送门
有对堆排序感兴趣的同学请点击银月城传送门
进入我们今天的正题,首先引入概念
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
看个例子,如一个无序数组3,5,7,2,6,1,3,8,4
归并排序的策略是将有序的子序列合并,也就是说我们要把它拆成若干个子序列,也就是拆成
3,5|7,2|6,1|3,8|4 之后我们对有序的子序列进行合并,先对3,5|7,2进行合并
3 | 5 | 7 | 2 | |
↑ | ↑ |
3 | 5 | 7 | 2 | |
↑ | ↑ |
3 | 5 | 7 | 2 | |
↑ | ↑ |
同样操作我们对6,1,3,8也进行一下归并,得到新的数组是1,3,6,8
然后在堆2,3,5,7和1,3,6,8进行排列,得到新的数组1,2,3,3,5,6,7,8
最后对1,2,3,3,5,6,7,8和4进行排列,得到最终数组1,2,3,3,4,5,6,7,8
这就是一个完整的归并排序,下面我们看代码
public class MergeSort { //合并方法 private static void mergeArray(int[] array,int l,int m,int r){ //nlogn //start1 = l end1 = m //start2 = m+1 end2=r //指定长度结果 int[] temp = new int[r-l+1]; //start1 int i = l; //start2 int j = m+1; int k = 0;//temp下标 while(i <= m && j <= r){ temp[k++] = array[i] < array[j] ? array[i++] :array[j++]; } //右侧数组用完,左侧数组全部拿下来 while(i <= m){ temp[k++] = array[i++]; } //左侧数组用完,右侧数组全部拿下来 while(j <= r){ temp[k++] = array[j++]; } //新数组赋值给老数组 for (int x = 0, y = l; x < temp.length; x++ , y++) { array[y] = temp[x]; } } private static void mergeSort(int[] array,int l,int r){ if(l == r){ return; } int m = (l+r)/2; mergeSort(array, l, m);//左 mergeSort(array, m+1, r);//右 mergeArray(array, l, m, r);//合并 } public static void main(String[] args) { int[] array = new int[]{3,5,7,2,6,1,3,8,4}; mergeSort(array, 0, array.length-1); for (int i : array) { System.out.print(i+","); } } }
我们先调用mergeSort方法,里面递归调用mergeSort,目的在于把数组分成多个有序的小数组,然后调用mergeArray进行归并操作,得到最终数组
代码上面有详细的注释,可以根据上面的步骤对照看一下,如果有问题请留言,第一时间解答
相关文章推荐
- 排序算法合集(插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,简单选择排序,堆排序,归并排序)
- 排序算法——归并排序
- 排序算法Python(冒泡、选择、快速、插入、希尔、归并排序)
- 排序算法之归并排序
- 各类排序算法实现(堆排序、希尔排序、快速排序、归并排序等)
- 排序算法之归并排序
- 算法系列(四)排序算法中篇--归并排序和快速排序
- 排序算法-归并排序
- [027]八大排序算法详解——归并排序
- 常用的排序算法(快速排序、插入排序、希尔排序、堆排序、冒泡排序、选择排序、归并排序)
- 算法 排序算法之归并排序
- 排序算法-归并排序
- 排序算法的C++实现与性能分析(插入排序、归并排序、快速排序、STOOGE排序、堆排序)
- 排序算法之归并排序
- 排序算法之归并排序
- 常见的排序算法(四)( 归并排序,计数排序 , 基数排序)
- 9种排序算法——堆排序,归并排序,插入排序,选择排序
- 排序算法(五):JAVA实现归并排序
- 排序算法之归并排序
- 排序算法(堆排序、插入排序、归并排序、快速排序)