归并排序(Java)

归并排序的思想:

  1. 先实现一个数组的中间位置“断裂”为两个子数组,利用索引实现,一直到每一个都被分开;
  2. 直到最后两个数据都被分开后,然后借助辅助数组实现排序与合并操作;
  3. 最后递归返回到最初的时候,便实现了整个递归排序

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列[2]。

归并排序

归并排序的代码实现:

public class MergeSort{
  // 单独列出此函数,而不是直接调用Sort是因为输入只有arr数组,同时为了更好递归而设置的
  public static void MergeSort(int[] arr){
    Divide(arr, 0, arr.length-1)  
  }

  private static void Divide(int[] arr, int left, int right){
    if(left >= right) return;
    int mid = (left + right)/2;
    // 左右部分依次断裂,减少交换数据的作用
    Divide(arr, right, mid);
    Divide(arr, mid+1, right);
    // 最后才比较大小归并数组
    MergeAndSort(arr, left, mid, right);
  }

  private static void MergeAndSort(int[] arr, int left, int mid, int right){
    int[] tmpArr = new int[a.lenght];
    int rightStartIndex = mid + 1;
    int tmpIndex = left;
    int copyIndex = left;

    // 比较左右两部分数组的大小,小的放入到tmpArr数组中
    while(left <= mid && rightStartIndex <= right){
      if(arr[left] < arr[rightStartIndex]) tmpArr[tmpIndex++] = arr[left++];
      else tmpArr[tmpIndex++] = arr[rightStartIndex++];
    }
    // 判断左边是否还有数据剩余,如果有则把数据拷贝到tmpArr数组右边,因为左边已经是排好序的,所以剩余的数据肯定是最大的
    while(left <= mid){
      tmpArr[tmpIndex++] = arr[left++];
    }
    // 判断右边是否还有数据剩余,如果有则把数据拷贝到tmpArr数组右边,因为右边已经是排好序的,所以剩余的数据肯定是最大的
    while(rightStartIndex <= right){
      tmpArr[tmpIndex++] = arr[rightStartIndex++];
    }
    // 把tmpArr数组排好序的数据依次拷贝到原数组中
    while(copyIndex <= right){
      arr[copyIndex] = tmpArr[copyIndex];
      copyIndex++;
    }
  }
}

时空复杂度

时间复杂度

分析:主要是考虑两个函数的时间花销,一、数组划分函数Divide();二、有序数组归并函数MergeAndSort();
①调用Divide()函数把原数组划分成两部分,那每一小部分排序好所花时间则为 T[n/2]。
②MergeAndSort()函数的时间复杂度为O(n),有两个时间复杂度为O(n)的while,一个是把非排序的数据保存到辅助数组,一个是把辅助数组中的数据拷贝到原数组。所以,2O(n) = O(n)
③把两部分都合并起来,就是
T(n) = 2T(n) + O(n)

结果就是T(n) = O(n*lgn)

空间复杂度

归并的空间复杂度就是临时的辅助数组和递归时压入栈的数据所占用的空间:n + logn;所以空间复杂度为: O(n)

参考文献:

[1] MergeSort(归并排序)算法Java实现
[2] 排序算法(Java)——那些年面试常见的排序算法
[3] 排序算法之 归并排序 及其时间复杂度和空间复杂度
[4]八大排序算法总结与java实现

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • 一 今天,我死了 或许在昨天,也有可能是前天,记不太清楚了。 ...
    丢了尾巴的猪阅读 527评论 4 3
  • 最近对人类历史上的大牛进行了一些研究和思考,我发现了他们的一些共性。虽然这些共性可能也被前人总结过,但我看到的是他...
    fengtasy阅读 235评论 0 0
  • 病了一周,突然觉得其实每天都很忙,还都很累。 真累啊 昨天打了一只尾戒,3.2号,结果今天那0.2号空了好大一圈。...
    孙仲_阅读 297评论 0 0