Java归并排序
来源:互联网 发布:java定义数组并赋值 编辑:程序博客网 时间:2024/06/09 22:07
归并排序就是将2个有序的序列合并起来,其时间复杂度为O(nlgn),而且它是一种稳定的排序,它的缺点是需要额外n的空间来辅助排序。
接下来看其Java实现
public class MergeSort { public static void main(String[] args) { Integer[] arr = {1, 6, 9, 3, 2, 11, 15, 4}; mergeSort(arr); Arrays.sort(arr); } public static void mergeSort(Integer[] arr) { sort(arr, 0, arr.length - 1); } public static void sort(Integer[] arr, int left, int rigth) { if (left >= rigth) { return; } int center = (left + rigth) / 2; //对左边的进行递归排序 sort(arr, left, center); //右边进行递归排序 sort(arr, center + 1, rigth); //两边排序好的进行合并 merge(arr, left, center, rigth); print(arr); } /** * 合并 * @param arr * @param left * @param center * @param right */ public static void merge(Integer[] arr, int left, int center, int right) { //辅助数组 Integer[] aux = new Integer[arr.length]; //辅助数组下标 int auxIndex = left; //存储左边下标 int temp = left; //中间的位置 int mid = center; center += 1; //遍历比较直到有一边的数组比较完成 while (left <= mid && center <= right) { if (arr[left] <= arr[center]) { aux[auxIndex++] = arr[left++]; } else { aux[auxIndex++] = arr[center++]; } } //下面2个while是将没有合并完成的一边放入数组 while (left <= mid) { aux[auxIndex++] = arr[left++]; } while (right >= (center)) { aux[auxIndex++] = arr[center++]; } //将排序好的数组放回原数组中 while (temp <= right) { arr[temp] = aux[temp++]; } } /** * 打印数组 * @param arr */ public static void print(Integer[] arr) { for (Integer a : arr) { System.out.print(a + ", "); } System.out.println(); }}
过程就是递归排序两边的序列,然后将排序好的两边序列进行合并。
JDK中改进过的归并排序
jdk中的工具类对数组和list进行的排序便是改进过的归并排序
private static void mergeSort(Object[] src, Object[] dest, int low, int high, int off) { int length = high - low; // 数组小于7时将使用插入排序 if (length < INSERTIONSORT_THRESHOLD) { for (int i=low; i<high; i++) for (int j=i; j>low && ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--) swap(dest, j, j-1); return; } //从中间分两部分进行递归 int destLow = low; int destHigh = high; low += off; high += off; int mid = (low + high) >>> 1; mergeSort(dest, src, low, mid, -off); mergeSort(dest, src, mid, high, -off); //如果一边最大的小于另一边最小的,直接合并 if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) { System.arraycopy(src, low, dest, destLow, length); return; } // 将两边的序列进行合并 for(int i = destLow, p = low, q = mid; i < destHigh; i++) { if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0) dest[i] = src[p++]; else dest[i] = src[q++]; } }
0 0
- java排序--归并排序
- 排序-归并排序-Java
- 归并排序Java实现
- java归并排序算法
- JAVA归并排序算法
- java归并排序
- java归并排序
- Java实现归并排序
- 归并排序(java)
- 25、JAVA归并排序
- java 归并排序
- java归并排序
- Java归并排序
- 归并排序 java
- Java实现归并排序
- 归并排序Java实现
- java 归并排序
- Java归并排序
- 如何安装Hadoop 2.6.0完全分布式?
- HDU.5120 Intersection
- Linux的简单介绍
- 阻塞和非阻塞等待
- poj 2274 线段树+堆(优先队列)
- Java归并排序
- windows下C语言开发环境搭建
- HDU 1176 免费馅饼(DP)
- 编程的智慧
- ScrolView和RecyclerView嵌套使用的问题
- SQLi Labs Lesson1
- 过滤器应用案例分析
- C++常见知识点总结
- 写一个宏可以将一个数字的奇数位和偶数位交换