[算法基础]归并排序
来源:互联网 发布:淘宝最好的饰品店 编辑:程序博客网 时间:2024/05/17 02:49
归并排序即将目标数组分成N个最小的组(相邻的2个数字),并将这些最小子数组排序,依次合并相邻的子数组,最后各自有序的子数组将会合并成完全有序的数组。
这将需要用到递归思想。
java实现
static class MergeSort{ static void sort(int[] a, int start, int end){ int mid = (start + end) / 2; //说明已经分解到最小的组 if(start >=end) return; sort(a, start, mid); //继续分解上半段 sort(a, mid + 1, end); //分解下半段 merge(a, start, mid, end); //合并 } private static void merge(int[] a, int start, int firstEnd, int secondEnd){ int index1 = start, index2 = firstEnd + 1; int len = secondEnd - start + 1; int[] tmp = new int[len]; //临时数组,用于存放排好序的数字 int tmpIndex = 0; while(index1 <= firstEnd && index2 <= secondEnd){ if(a[index1] <= a[index2]){ //逐个对比2个子数组的元素,小的优先放到tmp数组中 tmp[tmpIndex++] = a[index1++]; } else { tmp[tmpIndex++] = a[index2++]; } } //其中一个子数组已经遍历完成,那么将另一个子数组中剩下的元素也插入到tmp while(index1 <= firstEnd) { tmp[tmpIndex++] = a[index1++]; } while(index2 <= secondEnd) { tmp[tmpIndex++] = a[index2++]; } for(int i = 0;i<len;i++){ //将tmp数组覆盖目标数组对应的部分 a[start++] = tmp[i]; } } }
效率对比
最后使用随机生成的数组来测试下快速排序、冒泡排序、选择排序和归并排序的效率。
长度为25000的数组:
快排和归并还是很快的。
quickSort time:9bubbleSort time:1231selectionSort time:170MergeSort time:10
长度为50000的数组:
快排和归并依然保持在两位数的时间。
quickSort time :20bubbleSort time :4705selectionSort time :676MergeSort time :16
长度为150000的数组:
看到快排和归并排序的优势已经完全显现了。
quickSort time :44bubbleSort time :39902selectionSort time :5766MergeSort time :29
阅读全文
0 0
- 【算法基础】归并排序
- 算法基础-归并排序
- 基础算法-归并排序
- 基础算法-归并排序
- 基础算法-归并排序
- [算法基础]归并排序
- 基础排序算法-归并排序
- 归并排序--基础的算法
- 算法基础之归并排序
- 算法基础之排序篇-归并排序
- 基础算法总结之归并排序
- 基础算法学习笔记—归并排序
- 算法基础3—归并排序
- 【基础算法】排序-复杂排序之一(归并排序)
- 基础数据结构算法_快速排序,堆排序,归并排序
- 【基础排序】归并排序
- 基础排序:归并排序
- 排序算法-归并排序
- struts2中ognl标签的使用
- 【持久化框架】Mybatis与Hibernate的详细对比
- fullcalendar搜索事件并定位以及跳转到指定年月
- IIC通讯协议学习
- HTML基础
- [算法基础]归并排序
- CentOS(Linux) SVN服务器搭建+同步更新+多版本库+开机启动
- java中instanceof用法
- android (xutlis)
- bzoj4868&&5213jzoj[Shoi2017]期末考试 枚举或三分
- 自定义view圆环跟随progressbar进度改变中心的texview(百分比)
- Android 三秒跳转另一个页面
- (31)Object类中equals()方法
- 计提凭证两种处理方案