排序-归并排序

基本思想:是指将两个或两个以上的有序表合并成一个新的有序表。

具体步骤:

(1首先将整个表看成是n个有序子表,每个子表的长度为1。

(2)然后两两归并,得到n/2个长度为2的有序子表。

(3)然后再两两归并,直至得到一个长度为n的有序表为止。

平均时间:O(nlogn)

最好情况:O(nlogn)

最坏情况:O(n2)

辅助空间:O(n)

稳定性:稳定

适用场景:n比较大时

代码实现:

   public static void mergeSort(int[] list) {
mergeSort(list, 0, list.length - 1);
} private static void mergeSort(int[] list, int left, int right) {
if (left >= right)
return;
int center = (left + right) / 2;
mergeSort(list, left, center);
mergeSort(list, center + 1, right);
merge(list, left, center, right);
} private static void merge(int[] list, int left, int center, int right) {
int[] tmpList = new int[list.length];
int mid = center + 1;
int k = left;
int tmp = left;
while (left <= center && mid <= right) {
if (list[left] <= list[mid])
tmpList[k++] = list[left++];
else {
tmpList[k++] = list[mid++];
}
} while (left <= center) {
tmpList[k++] = list[left++];
}
while (mid <= right) {
tmpList[k++] = list[mid++];
}
// 将临时数组中的数据保存至原数组中
while (tmp <= right) {
list[tmp] = tmpList[tmp++];
}
}

归并排序-java的更多相关文章

  1. 归并排序 求逆序数 链表的归并排序 多线程归并排序 java

    import java.util.Scanner; public class Main { private static int count=0; public static void mergeso ...

  2. 二路归并排序java实现

    二路归并排序:其核心思想时将问题一分为二,并递归调用一分为二方法,使问题分割到不能再分各的原子问题,然后再归并,从实现原子问题开始,层层向上归并,最终解决整体问题.即所谓“分而治之,万流归一” 二路归 ...

  3. 自顶向下(递归)的归并排序和自底向上(循环)的归并排序——java实现

    归并排序有两种实现方式,自顶向下和自底向上.前者的思想是分治法,现将数组逐级二分再二分,分到最小的两个元素后,逐级往上归并,故其核心在于归并.后者的思想相反,采用循环的方式将小问题不断的壮大,最后变成 ...

  4. 单向链表的归并排序——java实现

    在做Coursera上的Algorithms第三周测验练习的时候有一道链表随机排序问题,刚开始没有什么思路,就想着先把单向链表归并排序实现了,再此基础上进行随机排序的改造.于是就结合归并排序算法,实现 ...

  5. leetcode23 多个拍好序的链表进行归并排序 (java版本)

    题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...

  6. 归并排序java

    import java.util.Arrays; public class MergeSort { public static void main(String[] args) { MergeSort ...

  7. 归并排序—Java版

    一开始做算法的时候,感觉递归算法很绕,所以我就在阅读别人代码的基础上,对代码每一步都添加自己的注解,方便我以后的学习. public class MergeSort { /** * 归并排序 * @p ...

  8. 归并排序Java实现

    package practice; import edu.princeton.cs.algs4.*; /* * 归并排序 * 时间复杂度O(NlgN) N为数组长度 * 归并排序在小数组上表现并不好可 ...

  9. 归并排序——Java实现

    一.排序思想 将两个或两个以上的一排序文件合并成一个有序文件的过程叫归并,而归并排序就是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用.将以有序的了序列合并,得到完全有序 ...

随机推荐

  1. transitionend的运用案例

    transitionend事件代表着过渡动画结束后 原生的绑定方法 obj.addEventListener('transitionEnd', function(){ //do soming }) 我 ...

  2. uvm - dut

    module dut(clk, rst_n, rxd, rx_dv, txd, tx_en); input clk; input rst_n; :] rxd; input rx_dv; :] txd; ...

  3. Swiper.js 中文API手册

    本文分享自 http://www.cnblogs.com/scavengers/p/3760449.html ---------------------------华丽的分割线------------ ...

  4. Be a new gentleman

    有人说:'生活是个大染缸',对于自制力不强的我深表无奈,时常自省的我虽然徘徊在层次边缘,但还是依着光明一点点靠近: 着装得体(改善消费观念,价值观) 讲个人卫生,保持公共环境卫生 女士优先 与人保持安 ...

  5. 合并两个排好序的链表(c++)

    #include<iostream> struct node{ int payload; node* next; node(int payload){this->payload=pa ...

  6. bwa用法

    一 建立索引 比对之前,需要对fasta文件构建FM-index索引:bwa index -a bwtsw hg19.fasta 生成 hg19.fasta.amb.hg19.fasta.ann.hg ...

  7. 提高SQL查询效率(SQL优化)

    要提高SQL查询效率where语句条件的先后次序应如何写 http://blog.csdn.net/sforiz/article/details/5345359   我们要做到不但会写SQL,还要做到 ...

  8. AngularJs自定义指令详解(7) - multiElement

    multiElement不太常用,从下面这个例子可以大致看出它的作用: <!DOCTYPE html> <html> <head lang="en"& ...

  9. [python] os.path说明

    os.path - Common pathname manipulations操作 This module implements some useful functions on pathnames. ...

  10. Crystal Reports拉报表报错:Error detected by database DLL

    问题描述: 最近在使用Crystal Reports打印报表时,提示错误信息:"Error detected by database DLL." 如下图: 经查找,是因为数据库名称 ...