package com.sort.admin;
public class MergeSort {
/**
* 归并排序 - O(n*㏒2n)
*
* @param arr 需要排序的数组
*/
public static void sort(int[] arr, int left, int right) {
if (left == right) {
return;
}
// 分成两半
int mid = left + (right - left) / 2;
// 左边排序
sort(arr, left, mid);
// 右边排序
sort(arr, mid + 1, right);
merge(arr, left, mid + 1, right);
}
/**
* 假设一个数组里面左右两数组已经排好顺序使用归并
*
* @param arr 归并数组
* @param leftPtr 左边数组的左指针
* @param rightPtr 右边数组的左指针
* @param rightBound 数组右边界
*/
public static void merge(int[] arr, int leftPtr, int rightPtr, int rightBound) {
if (leftPtr > rightPtr || rightPtr > rightBound) {
return;
}
int mid = rightPtr - 1;
int[] temp = new int[rightBound - leftPtr + 1];
int i = leftPtr;
int j = rightPtr;
int k = 0;
while (i <= mid && j <= rightBound) {
temp[k++] = arr[i] <= arr[j] ? arr[i++] : arr[j++];
}
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= rightBound) {
temp[k++] = arr[j++];
}
for (int l = 0; l < temp.length; l++) {
arr[leftPtr + l] = temp[l];
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void print(int[] arr) {
System.out.println("arr -- >");
for (int j : arr) {
System.out.print(j + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {1, 4, 7, 9, 2, 3, 5, 6, 8};
print(arr);
sort(arr, 0, arr.length - 1);
print(arr);
}
}
归并排序
- 本文链接: https://sly.plus/archives/mergesort
- 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议。转载请注明出处!