【图解算法】排序算法——归并排序
2017-06-12 23:54
405 查看
0.什么是归并排序(Merge sort)?
是创建在归并操作上的一种有效的排序算法,效率为O(n log n)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。(from zh.wikipedia.org)我对归并排序的理解是——分而治之,就是一个问题看起来很复杂,那就将他分开处理,这也是递归的思想; 就拿排序这件事件来说,对一个数组的排序,我们可以将他分成两个数组来处理,再对这两个数组同样的道理来处理,将他们分别分成两个数组来处理…… 直到数组无法再细分下去(即数组的长度为1,只有一个元素的数组肯定是有序的),分为之后的数组进行合并操作,向上整合整个数组,最后到达得到一个有序的数组的目的。
可能这样说得很抽象,我们一起来看归并排序的动态处理元素的图例:
看着图的同时再来看一看具体的代码实现过程:
public static void main(String [] args){ int[] t = {18,7,8,6,33,2,9,1}; mergSort(t,0,7); for (int i = 0;i<t.length;i++) System.out.print(t[i] + "\t"); } public static void mergSort(int [] arr,int l,int r){ if(l>=r) return; int mid = (l+r)/2; //递归二分 将数组分为 [左,中],(中,右] mergSort(arr,l,mid); mergSort(arr,mid+1,r); //归并排序 int aux[] = new int[r-l+1]; //这里弄一个要处理的数组副本 长度是 R-L+1 for (int i =l;i<=r ;i++) //副本数组从 L 开始,所以与原数组存在一个 L 的偏移量 aux[i-l] = arr[i]; int i = l,j = mid+1; //i记录左边元素的下标位置 j记录右边元素的下标位置 for (int k =l;k <= r; k++){ //k记录 arr 的下标位置 if(i >mid){ arr[k] = aux[j-l]; j++; }else if(j >r){ arr[k] = aux[i-l]; i++; }else if(aux[i-l] < aux[j-l]){ arr[k] = aux[i-l]; i++; }else{ arr[k] = aux[j-l]; j++; } } }
程序输出:
1 2 6 7 8 9 18 33
相关文章推荐
- 常用算法--基本排序算法(冒泡排序,选择排序,插入排序,快速排序,归并排序,桶排序)
- 常见的五类排序算法图解和实现(归并类:二路归并排序)
- 图解排序算法(四)之归并排序
- [算法]-高级排序算法-归并排序
- 【图解算法】排序算法——快速排序
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
- 算法系列(四)排序算法中篇--归并排序和快速排序
- 小学生图解排序算法:⑥归并排序
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 【算法】排序算法(三)——归并排序
- 【图解算法】排序算法——堆排序
- 归并排序 图解算法过程
- 图解排序算法(四)之归并排序
- 【排序算法】图解算法——用眼睛学习算法
- 算法系列(四)排序算法中篇--归并排序和快速排序
- 常用算法之排序算法四【归并排序】
- 算法 排序算法之归并排序
- 【算法】排序算法第四讲:归并排序
- 算法—归并排序改良后亿级秒排及排序算法的极致
- 【图解算法】排序算法——插入排序