java - 就地在链表上实现自然归并排序,并且只交换来自节点的项目

标签 java algorithm sorting linked-list mergesort

我必须在链表上实现自然合并排序(这很容易),但我无法更改节点的“下一个”属性,只能交换它们具有的值。我也不能倒退,因为节点没有“prev”属性。 (链接列表没有随机访问)而且我无法创建新节点。

我只需要一些关于合并功能应该如何的提示。

我知道在我将两个子列表合并之前保持它们的顺序是关键,但我找不到办法做到这一点。

这是节点类。他们保存了一个通用的Item和下一个节点的地址

private class Node {
    Item item;
    Node next;

    public String toString() {
        if (next == null) return "[" + item + "]" + "->" + "null";
        return "[" + item + "]" + "->" + next.item + ", ";
    }
}

最佳答案

要获得灵感,请查看 STL 的 inplace_sort 实现。该算法的核心部分是巧妙的旋转。当然,它需要向后遍历,这可以通过递归实现。

简而言之,合并部分是沿着

    merge (begin, mid, end)
        left_mid = middle(begin, mid)
        right_mid = lower_bound(left_mid.value, mid, end)
        pivot = rotate(left_mid, mid, right_mid)
        merge(left, left_mid, pivot)
        merge(pivot, right_mid, end)

pivot 是初始 begin 所在的节点。为简洁起见,省略了递归。

关于java - 就地在链表上实现自然归并排序,并且只交换来自节点的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56047612/

相关文章:

java - post/put API 请求的参数污染

java - servlet 中 getLocalPort() 和 getServerPort() 的区别

image - 需要自动消除图像和物体外边界的噪声

c++ - 在 C++ 程序中以编程方式检测字节顺序

python - 计算字符串中最大连续 "a"的数量。 python 3

C++ Jeopardy 游戏算法设计

java - 如何删除 cookie

java - 多个线程之间共享和锁定固定数量的资源

c - 删除/替换字符数组中的两个或多个连续字符

c++ - 排序算法是否应该在比较函数中传递相同的元素