マージソートとその時間計算量分析
マージソートとは?
マージソートは分割統治の考え方を体現しており、元の配列を分割し、各部分を別々にソートしてから、それらを 1 つずつマージし、最終的に目的の結果を達成します。
- 配列を分割する
- 配列をソートする
- 並べ方(小から大)
コード部分
/**
* @author `dongxu.kwb`
* @date `2022/8/30`
*/
public class MergeSort {
public static void main(String[] args) {
int[] arr = {
79,3213,3,5,45,65};
mergeSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void mergeSort(int[] arr) {
//判断下数组是否为空,或者是一个数
if (arr == null || arr.length < 2) {
return;
}
//给整个数组分割并且排序
process(arr, 0, arr.length - 1);
}
/**
* 主要负责递归
* @param arr
* @param left
* @param right
*/
public static void process(int[] arr, int left, int right) {
//递归结束条件
if (left == right) {
return;
}
//找中点
int mid = left + ((right - left) >> 1);
//左右拆分并且排序
process(arr, left, mid);
process(arr, mid + 1, right);
//排序
merge(arr, left, mid, right);
}
/**
* 主要负责排序
* @param arr
* @param left
* @param mid
* @param right
*/
public static void merge(int[] arr, int left, int mid, int right) {
int[] help = new int[right - left + 1];
int i = 0;
int p1 = left; //左指针
int p2 = mid + 1; //右指针
//如果左右指针都没超出边界
while (p1 <= mid && p2 <= right) {
help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
}
//左指针超出边界
while (p1 <= mid) {
help[i++] = arr[p1++];
}
//右指针超出边界
while (p2 <= right){
help[i++] = arr[p2++];
}
//将排好序的部分同步到arr原数组中
for (int i1 = 0; i1 < help.length; i1++) {
arr[left + i1] = help[i1];
}
}
}
時間の複雑さの分析
再帰関数では、部分再帰が同じ可能性を持つことがわかりました。したがって、マスター式を使用できます。
マスター表現の記事を参照してください: https://blog.csdn.net/abaidaye/article/details/126603143
process(arr, left, mid);
process(arr, mid + 1, right);
マージ関数では、何があっても、2 つのポインターの合計が n 個の数値をトラバースするため、d=O(n) となります。
したがって、この質問の基本公式は、T(n) = 2 * T(n/2) + O(n) です。
このときlogba log^a_bログ_ _ba== d なので、時間計算量は O(n log 2 n log_2^nログ_ _2n)