合并排序算法
引言
合并排序算法是一种经典的排序算法,是分治法的典型应用之一。它将一个待排序的数组分成两个子数组,分别对这两个子数组进行排序,然后将两个有序子数组合并成一个有序数组。本文将介绍合并排序算法的原理、实现以及其在Java中的应用。
算法原理
合并排序算法的基本思想是将一个待排序的数组不断地二分,直到子数组的长度为1或0,然后将这些长度为1或0的子数组进行合并,最终得到一个有序的数组。合并操作是合并排序算法的关键部分,它将两个有序子数组合并成一个有序数组。
合并操作的思路如下:
- 创建一个临时数组temp,用于存放合并后的有序数组。
- 设定两个指针i和j,分别指向两个待合并的子数组的起始位置。
- 比较指针i和j指向的元素大小,将较小的元素放入temp数组中,并将对应指针后移一位。
- 重复步骤3,直到任意一个子数组的指针超出范围。
- 将另一个子数组剩余的元素依次放入temp数组中。
- 将temp数组中的元素复制回原数组的对应位置。
合并排序算法的流程如下所示:
st=>start: 开始
op1=>operation: 将数组二分
op2=>operation: 对子数组进行排序
op3=>operation: 合并子数组
op4=>operation: 复制回原数组
e=>end: 结束
st->op1->op2->op3->op4->e
Java实现
下面是合并排序算法的Java实现:
public class MergeSort {
public static void mergeSort(int[] arr) {
int[] temp = new int[arr.length];
sort(arr, temp, 0, arr.length - 1);
}
private static void sort(int[] arr, int[] temp, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
sort(arr, temp, left, mid);
sort(arr, temp, mid + 1, right);
merge(arr, temp, left, mid, right);
}
}
private static void merge(int[] arr, int[] temp, int left, int mid, int right) {
int i = left;
int j = mid + 1;
int k = left;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= right) {
temp[k++] = arr[j++];
}
for (int m = left; m <= right; m++) {
arr[m] = temp[m];
}
}
}
实例分析
下面以一个实例来说明合并排序算法的应用。假设我们有一个待排序的数组:[5, 2, 9, 1, 3, 6]。
首先,将数组进行二分,得到两个子数组:[5, 2, 9]和[1, 3, 6]。
然后,对这两个子数组分别进行排序。对于子数组[5, 2, 9],继续进行二分,得到子数组[5]和[2, 9]。对子数组[2, 9]进行排序,得到[2, 9]。对于子数组[5],由于长度为1,无需排序。
对于子数组[1, 3, 6],继续进行二分,得到子数组[1]和[3, 6]。对子数组[3, 6]进行排序,得到[3, 6]。对于子数组[1],由于长度为1,无需排序。
接下来,将两个有序子数组[2, 9]和[3, 6]进行合并。根据合并操作,可以得到一个有序数组[2, 3, 6, 9]。
最后