【算法】归并排序(MergeSort)

1.简介

时间复杂度(time complexity) :

Average: O(nlogn)
Worst: O(nlogn)

空间复杂度(space comlexity) : O(n)

2.算法思想

归并排序是分治法(Divide and Conquer)的典型应用之一。其思想是将一个序列切割为最小单位的子序列(即只有一个元素的序列),使每个子序列有序(一个元素必然有序啦),再将有序的子序列两两合并(重点操作),保证合并后的序列仍然有序。

3.实现步骤

l: 最左元素的index r:最右元素的Index
1.判断参数有效,作为递归的出口。
l < r
2.找到中间点m,将一个序列分为两个子序列
m = (r+l) / 2
3.对第一个子序列调用mergeSort
mergeSort(arr,l,m)
4.对第二个子序列调用mergeSort
mergeSort(arr,m+1,r)
5.将排序好的两个子序列合并在一起且保证合并后的序列有序
merge(arr,l,m,r)

4.代码

static void merge(int[] arr, int l, int m, int r) { int[] temp = new int[arr.length]; int k = l; int p = m + 1; int index = 0; while (k <= m || p <= r) { if (k <= m && p <= r) { temp[index++] = arr[k] < arr[p] ? arr[k++] : arr[p++]; } else { if (k <= m) { temp[index++] = arr[k++]; } else { temp[index++] = arr[p++]; } } } for (int i = 0; i < index; i++) { arr[l + i] = temp[i]; } } static void mergeSort(int[] arr, int l, int r) { if (l < r) { int m = (l + r) / 2; mergeSort(arr, l, m); mergeSort(arr, m + 1, r); merge(arr, l, m, r); } }

__EOF__

本文作者LinM狂想曲
本文链接https://www.cnblogs.com/Oliver1993/p/13569615.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   LinM狂想曲  阅读(254)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示