排序算法之归并排序

算法思想

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

算法步骤

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
    重复步骤3直到某一指针超出序列尾
  4. 将另一序列剩下的所有元素直接复制到合并序列尾
归并排序示例

算法复杂度

  • 时间复杂度为O(nlog₂n) 这是该算法中最好、最坏和平均的时间性能。
  • 空间复杂度为 O(n)

算法稳定性

归并排序比较占用内存,但却是一种效率高且稳定的算法。

算法实现

public void mergeSort(int[] arr,int left,int right){
        if(left >= right){
            return;
        }

        int center = (right + left)/2;
        mergeSort(arr,left,center);
        mergeSort(arr,center + 1,right);
        merge(arr,left,right,center);
    }
private void merge(int[] arr,int left,int right,int center){
        int[] tmpArr = new int[right - left + 1]; //存储排序结果
        int tmpIndex = 0;

        int start1 = left;
        int start2 = center + 1;

        while(start1 <= center && start2 <= right){
            if(arr[start1] < arr[start2]){
                tmpArr[tmpIndex++] = arr[start1++];
            }else{
                tmpArr[tmpIndex++] = arr[start2++];
            }
        }

        while(start1 <= center){
            tmpArr[tmpIndex++] = arr[start1++];
        }
        while(start2 <= right){
            tmpArr[tmpIndex++] = arr[start2++];
        }

        tmpIndex = 0;
        while(left <= right){
            arr[left++] = tmpArr[tmpIndex++];
        }
    }

参考文章

  1. 八大排序算法
  2. 归并排序-百度百科
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,287评论 0 2
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,235评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,747评论 0 15
  • 终究拗不过好友的劝告,我还是答应去赴约,为了提高相亲的质量,我刻意化了妆。 说实话,我是一个化妆比素颜差别很大的人...
    素一航阅读 739评论 5 4
  • 文/婧曦 窗边垂挂着的帘 将这世界 隔绝成两个 帘外小雨绵绵 浇不灭的热情 狂风席卷 吹不散的欢笑 帘内黑暗的角落...
    JING_婧阅读 221评论 0 0