排序篇(6)--归并排序
来源:互联网 发布:php 默认编码 编辑:程序博客网 时间:2024/05/23 15:39
“归并”在数据结构中定义为:将两个或两个以上的有序数表组合成一个新的有序表。
一、归并排序
基本思想:利用归并的思想,假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列,再两两归并….,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为“2路归并法”。
二、归并排序算法
采用递归的方式
package Sort;/** * Created by L_kanglin on 2017/3/3. */public class TestMergingSort { public static void main(String[] args){ int[] adj = new int[]{9,1,5,8,3,7,4,6,2}; print(adj); mergeSort(adj); System.out.println(); System.out.println("归并排序后的数组"); print(adj); } public static void mergeSort(int[] data){ sortTest(data,0,data.length-1); } public static void sortTest(int[] data,int left,int right){ if(left>=right){ return; } //找出中间的索引 int center= (left + right)/2; //对左边数组进行递归 sortTest(data,left,center); //对右边数组进行递归 sortTest(data,center+1,right); //合并 mergeTest(data,left,center,right); } /* * data :数组对象 * left:左数组的第一个元素的索引 * center:左数组的最后一个元素的索引,center+1是右数组第一个元素的索引 * right :右数组最后一个元素的索引 * */ public static void mergeTest(int[] data, int left, int center, int right) { // 临时数组 int[] tmpArr = new int[data.length]; // 右数组第一个元素索引 int mid = center + 1; // third 记录临时数组的索引 int third = left; // 缓存左数组第一个元素的索引 int tmp = left; while (left <= center && mid <= right) { // 从两个数组中取出最小的放入临时数组 if (data[left] <= data[mid]) { tmpArr[third++] = data[left++]; } else { tmpArr[third++] = data[mid++]; } } while (mid <= right) { tmpArr[third++] = data[mid++]; } while (left <= center) { tmpArr[third++] = data[left++]; } // 将临时数组中的内容拷贝回原数组中 // (原left-right范围的内容被复制回原数组) while (tmp <= right) { data[tmp] = tmpArr[tmp++]; } } public static void print(int[] data) { for (int i = 0; i < data.length; i++) { System.out.print(data[i] + "\t"); } }}
运行结果如下:
9 1 5 8 3 7 4 6 2 归并排序后的数组1 2 3 4 5 6 7 8 9
三、归并排序的复杂度分析
在排序过程中,需要两两进行比较,不存在跳跃,因此归并排序是一种稳定的排序算法。当算法在最好、最坏以及平均时间复杂度都为O(nlogn),其空间复杂度为O(n+logn)。
文章只是作为自己的学习笔记,借鉴了网上的许多案例,如果觉得阔以的话,希望多交流,在此谢过…
0 0
- 排序篇(6)--归并排序
- 排序-6-归并排序
- 排序算法-中级篇(归并排序)
- 归并排序-归并排序
- 归并排序(合并排序)
- 合并排序(归并排序)
- 排序(7)归并排序
- 归并排序(Java) @排序
- 排序练习(归并排序)
- 归并排序(合并排序)
- 排序三(归并排序)
- 排序(3)---归并排序
- 排序(六):归并排序
- 排序之一(插入排序、归并排序)
- 单链表排序(快速排序、归并排序)
- 6-归并排序
- 排序--6归并
- 排序(希尔排序,堆排序,归并排序,快速排序)
- linux DES秘钥生成每次加密结果不同
- 1019. 数字黑洞 (20)
- 深入了解父类引用指向子类
- codeforces 766 C. Mahmoud and a Message
- 存储过程简介
- 排序篇(6)--归并排序
- os 中的文件操作
- 【每日一练】java基本练习
- 1020. 月饼 (25)
- bzoj 3992: [SDOI2015]序列统计 NTT
- 归并排序
- Android studio中使用C++入门知识
- Java集合类框架学习 4.3 —— HashMap(JDK1.8)
- 暴力解决recycleview跟scrollview嵌套问题