提问人:Gino.Montaner 提问时间:6/3/2023 更新时间:6/3/2023 访问量:16
Java 中插入排序和合并排序的组合是否就地排序并且稳定?
Is the combination of insertion-sort and mergesort in Java in-place sorting and stable?
问:
标题:插入排序和合并排序的这种组合是否就地稳定?
身体:
大家好,
我有这个 Java 代码,它是插入排序和合并排序的组合。我不确定这种组合算法是否被认为是就地和稳定的。如果有人能帮我澄清这一点,我将不胜感激。
代码如下:
package org.example;
import java.util.Arrays;
public class Main {
private static Comparable[] aux;
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
private static void exch(Comparable[] a, int i, int j) {
Comparable swap = a[i];
a[i] = a[j];
a[j] = swap;
}
private static void insertionSort(Comparable[] a, int lo, int hi) {
for (int i = lo; i <= hi; i++) {
for (int j = i; j > lo && less(a[j], a[j - 1]); j--) {
exch(a, j, j - 1);
}
}
}
private static void merge(Comparable[] a, int lo, int mid, int hi) {
int i = lo, j = mid+1;
for (int k = lo; k <= hi; k++) {
aux[k] = a[k];
}
for (int k = lo; k <= hi; k++) {
if (i > mid) a[k] = aux[j++];
else if (j > hi) a[k] = aux[i++];
else if (less(aux[j], aux[i])) a[k] = aux[j++];
else a[k] = aux[i++];
}
}
private static void sort(Comparable[] a, int lo, int hi) {
final int INSERTION_SORT_THRESHOLD = 10;
if (hi <= lo + INSERTION_SORT_THRESHOLD - 1) {
insertionSort(a, lo, hi);
return;
}
int mid = lo + (hi - lo) / 2;
sort(a, lo, mid);
sort(a, mid+1, hi);
merge(a, lo, mid, hi);
}
public static void sort(Comparable[] a) {
aux = new Comparable[a.length];
sort(a, 0, a.length - 1);
}
public static void main(String[] args) {
Integer[] a = {7, 3, 5, 1, 6, 8, 2, 4, 9, 0};
System.out.println("Before sorting: " + Arrays.toString(a));
Main.sort(a);
System.out.println("After sorting: " + Arrays.toString(a));
}
}
答:
0赞
rcgldr
6/3/2023
#1
插入排序是稳定的,因为交换只发生在相邻元素上,在代码中的 a[j] 和 a[j-1]。合并排序也很稳定,因此组合插入排序和合并排序将是稳定的。
评论