Java 中插入排序和合并排序的组合是否就地排序并且稳定?

Is the combination of insertion-sort and mergesort in Java in-place sorting and stable?

提问人:Gino.Montaner 提问时间:6/3/2023 更新时间:6/3/2023 访问量:16

问:

标题:插入排序和合并排序的这种组合是否就地稳定?

身体:

大家好,

我有这个 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));
    }
}

 
Java 合并 插入- 就地 排序

评论


答:

0赞 rcgldr 6/3/2023 #1

插入排序是稳定的,因为交换只发生在相邻元素上,在代码中的 a[j] 和 a[j-1]。合并排序也很稳定,因此组合插入排序和合并排序将是稳定的。