博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
归并排序(JAVA)
阅读量:7031 次
发布时间:2019-06-28

本文共 2065 字,大约阅读时间需要 6 分钟。

hot3.png

package org.rev.algorithm;/** * 归并排序,属于交换排序,时间复杂度为算法复杂度Ο(n log n),比快排序慢,但稳定。 *  * 1. 将一个序列递归拆分成多个有序的子序列。 *  * 2. 递归合并这些子序列,成为完整的子序列。 *  */public class MergeSort {  public static void main(String[] args) {    int[] data = {39, 11, 38, 97, 86, 37, 12, 4, 51, 18};    // 归并排序    MergeSort ms = new MergeSort();    ms.sort(data);    System.out.println("排序之后:");    ms.printData(data);  }  public void sort(int[] data) {    if (data.length > 0) { // length是0,就不能减1了。      mergeSort(data, 0, data.length - 1);    }  }  public void mergeSort(int[] data, int left, int right) {    if (left < right) {      int middle = (left + right) / 2;      System.out.println("left is:" + left + ", right is:" + right + ",  middle is:" + middle          + ",  data[" + middle + "]=" + data[middle]);      mergeSort(data, left, middle); // 对左边进行递归      mergeSort(data, middle + 1, right); // 对右边进行递归      merge(data, left, middle, right); // 归并      printData(data);    }  }  /**   * 归并两个数组,归并前两个数组是有序的,归并后的数组也是有序的。   *    * @param data 数组对象   * @param left 左数组第一个元素的索引   * @param middle 左数组的最后一个元素的索引,middle+1是右数组第一个元素的索引   * @param right 右数组最后一个元素的索引   */  private void merge(int[] data, int left, int middle, int right) {    // 临时数组    int[] tmpArr = new int[data.length];    // 右边的第一个元素的索引    int mid = middle + 1;    // tmp 临时变量,缓存左数组第一个元素的索引    int tmp = left;    // third 记录临时数组的索引    int third = left;    while (left <= middle && mid <= right) {      // 从两个数组中选取较小的数放入临时数组      if (data[left] <= data[mid]) {        tmpArr[third++] = data[left++];      } else {        tmpArr[third++] = data[mid++];      }    }    // 将剩余的部分放入临时数组    while (left <= middle) {      tmpArr[third++] = data[left++];    }    while (mid <= right) {      tmpArr[third++] = data[mid++];    }    // 将临时数组复制回原数组    while (tmp <= right) {      data[tmp] = tmpArr[tmp++];    }  }  /*   * 打印输出数组中的数据   */  private void printData(int[] data) {    for (int i = 0; i < data.length; i++) {      System.out.print(data[i] + "\t");    }    System.out.println();  }}

转载于:https://my.oschina.net/xiaoxishan/blog/374644

你可能感兴趣的文章
针对虚拟机搭建centos7不能上网问题处理方法
查看>>
React 源码分析
查看>>
JavaScript 算法之复杂度分析
查看>>
第六章——函数(inout参数与变异方法)
查看>>
掘金翻译计划月报 — 2018 年 2 月
查看>>
Android属性动画
查看>>
渐进式Express源码学习5-全副武装
查看>>
JVM难学?那是因为你没认真看完这篇文章
查看>>
python面试题(五)
查看>>
老司机 iOS 周报 #40 | 2018-10-22
查看>>
VirtualView iOS 模板加载功能实现详解
查看>>
这可能是最好的性能优化教程(二)
查看>>
被马化腾点赞的微信车票设计,背后有哪些故事?
查看>>
Spring理论基础-面向切面编程
查看>>
BloomFilter 原理,实现及优化
查看>>
PHP本地文件包含漏洞环境搭建与利用
查看>>
OGNL设计及使用不当造成的远程代码执行漏洞
查看>>
Vue-cli + express 构建的SPA Blog(采用前后端分离方案)
查看>>
ios中的多播委托
查看>>
Java基础-单例模式
查看>>