
Java归并排序算法的实现及优化
归并排序是一种基于比较的排序算法,它的主要思想是将待排序的序列分成若干个子序列,对每个子序列进行排序,最后将有序的子序列合并成一个整体有序的序列。
(1)分治:
首先,将待排序的序列不断二分,直到每个子序列只有一个元素。然后,再将这些子序列合并成有序的子序列。
下面是一个递归实现的归并排序算法的示例代码:
立即学习“Java免费学习笔记(深入)”;
public class MergeSort {
// 归并排序
public void mergeSort(int[] array, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
// 递归地对左右两边进行归并排序
mergeSort(array, left, mid);
mergeSort(array, mid + 1, right);
// 合并两个有序子序列
merge(array, left, mid, right);
}
}
// 合并两个有序子序列
public void merge(int[] array, int left, int mid, int right) {
int[] temp = new int[right - left + 1];
int i = left; // 左序列指针
int j = mid + 1; // 右序列指针
int k = 0; // 临时数组指针
while (i <= mid && j <= right) {
if (array[i] <= array[j]) {
temp[k++] = array[i++];
} else {
temp[k++] = array[j++];
}
}
while (i <= mid) {
temp[k++] = array[i++];
}
while (j <= right) {
temp[k++] = array[j++];
}
for (int l = 0; l < temp.length; l++) {
array[left + l] = temp[l];
}
}
}(2)合并:
合并函数的作用是将两个有序的子序列合并成一个有序的序列。具体实现中,我们需要创建一个临时数组,用来存放合并后的结果。在遍历子序列时,我们通过比较子序列中的元素,将较小的元素放入临时数组中,并移动相应的指针。最后,将临时数组中的元素复制回原数组。
(1)对小规模子序列使用插入排序:
当子序列的规模比较小时,插入排序的效率更高。因此,可以在归并排序的递归过程中,当子序列的规模小于一定阈值时,采用插入排序来替代递归过程。
public void mergeSort(int[] array, int left, int right) {
if (left < right) {
if (right - left <= THRESHOLD) {
// 子序列的规模小于阈值,采用插入排序
insertionSort(array, left, right);
} else {
int mid = (left + right) / 2;
mergeSort(array, left, mid);
mergeSort(array, mid + 1, right);
merge(array, left, mid, right);
}
}
}(2)优化合并过程:
在合并过程中,可以先将两个子序列分别存放在临时的两个数组中,然后再将两个临时数组合并到原数组中。这样一来,就可以避免在合并过程中反复创建临时数组。同时,由于临时数组的大小是固定的,所以可以定义为类的成员变量,避免递归过程中的重复创建。
public class MergeSort {
private int[] temp;
public void mergeSort(int[] array, int left, int right) {
if (left < right) {
if (right - left <= THRESHOLD) {
insertionSort(array, left, right);
} else {
int mid = (left + right) / 2;
mergeSort(array, left, mid);
mergeSort(array, mid + 1, right);
merge(array, left, mid, right);
}
}
}
public void merge(int[] array, int left, int mid, int right) {
int i = left;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= right) {
if (array[i] <= array[j]) {
temp[k++] = array[i++];
} else {
temp[k++] = array[j++];
}
}
while (i <= mid) {
temp[k++] = array[i++];
}
while (j <= right) {
temp[k++] = array[j++];
}
for (int l = 0; l < k; l++) {
array[left + l] = temp[l];
}
}
}综上所述,以上是Java归并排序算法的实现及其优化方法。通过优化合并过程和对小规模子序列使用插入排序,可以提升归并排序算法的效率和减少空间开销。在实际应用中,选择恰当的优化方法,根据排序序列的特点进行合理的选择,能够使算法更加高效。
以上就是实现和优化Java的归并排序算法的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号