图解归并排序
来源:互联网 发布:淘宝推广平台哪个好 编辑:程序博客网 时间:2024/06/05 02:06
归并排序的流程如下
第一步:对数列每次都进行切分,直到不能再切分
每次都对数列进行切分分组,直到每组的元素都只有一个,学过递归的话很容易想到这种重复性的动作用递归很容易实现。对于8个数的数列,切分三次直到第四层就不能再切分了。
第二步:进行归并
对于上述的数列,当每组的元素都是一个,也就是说每组的都是有序的了,递归返回,返回到倒数第二层。此时可对每组元素进行归并
再进行归并
可以看到归并将每组的数排成有序的了,最后我们将最后两组数再进行归并即可。
此时,数列有序,归并结束
编程思路
对于每次把数列按半切分分组,对分好的组进行归并这个流程可以用递归实现:
//归并过程 public static void merge(int arr[],int l,int mid,int r){ //归并排序辅助数组 int T[] = new int[r-l+1]; //T[0]到T[r-l]保存arr[l]到arr[r]的值 for(int i = l; i <= r; i++){ T[i-l] = arr[i]; } //使用i指向分组1的第一个数的位置,j指向分组2的第一个数的索引 int i = l,j = mid+1; //需要归并的数组位置是[l,r] for(int k = l ; k <= r; k++){ if(i > mid){ //归并后分组2还有元素,依次覆盖到原数组对应处 arr[k] = T[j-l]; j++; }else if(j > r){ //归并后分组2还有元素,依次覆盖到原数组对应处 arr[k] = T[i-l]; i++; }else if(T[i-l] < T[j-l]){ //将分组中小的数覆盖到原数组对应处 arr[k] = T[i-l]; i++; }else if(T[i-l] >= T[j-l]){ arr[k] = T[j-l]; j++; } } }
T[]是辅助数组,用来存放两个需要进行归并的分组。在归并时,每次将两组中的最小的那个数依次放到原数组。
这个过程如下所示:
优化
public static void merge_sort(int arr[],int l,int r){ if(l >= r) return; /**对于数不是很多的情况下,可以使用插入排序代替归并来提高效率 * if(r - l <= 10){ * 插入排序; * return; * } */ int mid = (l+r) / 2; merge_sort(arr,l,mid); merge_sort(arr,mid+1,r); //优化,归并时左边的最后一个数已经是小于右边第一个数时,可以不用归并了 if(arr[mid] > arr[mid+1]){ merge(arr,l,mid,r); } }
阅读全文
0 0
- 图解排序---归并排序
- 图解归并排序
- 图解归并排序
- 归并排序 图解算法过程
- 归并排序 图解算法过程
- 图解归并排序(转载)
- 图解"数据结构--内部排序算法"----归并排序
- 小学生图解排序算法:⑥归并排序
- 图解排序算法(四)之归并排序
- 图解排序算法(四)之归并排序
- 图解排序算法(四)之归并排序
- 图解归并排序算法(java版)
- 归并排序算法的过程图解
- 【图解算法】排序算法——归并排序
- 常见的五类排序算法图解和实现(归并类:二路归并排序)
- 归并排序算法原理分析与代码实现【图解】
- 归并排序——史上最详细图解教程!!!
- 归并排序-归并排序
- Java多线程总结之线程安全队列Queue
- 智能照明:蓝牙5.0将打败ZigBee?
- Java String、StringBuffer、StringBuilder
- Mapper.xml文件中如何判断多个参数不为空和null
- python-igraph基本用法(一)
- 图解归并排序
- 九度题目1040:Prime Number
- Linux中断enable_irq&enable_irq_wake
- acess denied for user 'Administrator'@'localhost' (using password: YES) 解决办法
- Effective Java 对于所有对象都通用的方法 12.考虑实现Comparable(可以比较)接口
- 数组
- C++ string提取空格之间的substring的方法
- 全国首家互联网银行——微众银行内推啦!!!技术产品各个岗位可供选择!!!最后一周!!!抓紧时间啦!!!
- struts restful风格http接口