当前位置: 首页 > 知识库问答 >
问题:

如何使用LinkedList实现合并排序?

匡旭东
2023-03-14

我正在尝试使用LinkedList实现合并排序,到目前为止,

class Node{


Node next;
int data;

public Node (){

}

public Node(int _data){

    this.data = _data;
   }
  }


 public  class myTest{

   private static Node head;
   private static Node current; 

   public void myTest(){

    this.head = null;
    this.current = null;
}

public static void insert( int data ){

    Node newNode = new Node(data);

    if (head == null){

        head = newNode;
        current = head;
    }

    else {

        current.next = newNode;
        current = newNode;
    }
}

public static void display(Node cur ){

    while( cur != null){

        if (cur.next != null){
            System.out.print(cur.data + " -> ");
        }

        else{
            System.out.print(cur.data +" ");
        }

        cur = cur.next;
    }

    System.out.println();
}

private static Node mergeSort(Node headOriginal ){

    if (headOriginal == null || headOriginal.next == null ){

        return headOriginal; 
    }

    Node a = headOriginal;
    Node b  = headOriginal.next;

    while( b != null && b.next != null ){

        headOriginal = headOriginal.next;
        b = (b.next).next;
    }

    // split in 2 parts 
    b = headOriginal.next;
    headOriginal.next = null;

    return merge( mergeSort(a), mergeSort(b) );
}


 // sort among the 2 parts
 public static Node merge(Node a, Node b) {

    Node c = new Node();
    Node head_1 = c;

    while ((a != null) && (b != null)) {

        if ( a.data <= b.data ){

            c.next = a;
            c = a;
            a = a.next;
        }

        else {

            c.next = b;
            c = b;
            b = b.next;
        }
    }

    c.next = (a == null) ? b : a;
    return head_1.next;        
}  

public static void main(String[] args ){

    int [] arr = {12, 34, 5, 6, 7};

    for (int j =0; j < arr.length; j++){

        insert( arr[j] );
    }

    mergeSort(head);
    display(head);

  }
}

mergeSort函数取LikedList的原始头,LikedList由insert函数生成。我认为该函数正确地创建了升序的排序LL。显示功能假设打印LL。在这种情况下,它仅从原始磁头(12)打印到已排序的LL的末端,并打印'12'-

  1. 我的程序是否正常,或者需要一些改进来实现合并排序

共有1个答案

窦伟
2023-03-14

我想这是出于学术目的,因为Sandeep的评论是正确的,LinkedList不是mergesort的合适数据结构。编写自己的链表也可能不是一个好主意,因为Java API数据结构设计良好,测试良好!

但是对于您的代码,它工作得非常好!唯一的错误是,您使用的不是mergesort的结果,而是对head的“旧”引用。如果你更新你的参考资料,应该没问题。尝试:

head = mergeSort(head);
display(head);

在你的主要方法中,它应该按预期工作!

 类似资料:
  • 我一直在尝试在我正在开发的程序中实现各种类型的排序。到目前为止,我已经成功地对整数进行了排序。为了使这个(合并)代码排序为字符串数组而不是整数数组,需要做哪些更改?时间复杂度会变化吗?如果是这样,是好是坏? 编辑1:尝试使用比较器。有些事情似乎不对劲。返回错误,例如无法从字符串转换为int,反之亦然。固定的 编辑2:我在if(数组[low].compareTo(数组[high])行得到NullPo

  • 我创建了自己的linkedlist。我想使用集合对我的linkedlist进行排序。排序方法。所以我将MyLinkedList类扩展到java。util。链接列表。我还创建了Comparator和Comparable实现。但两者都不起作用。请查找下面的代码。 //链接列表实现。 //测试链接列表 //员工类

  • 本文向大家介绍Ruby实现的合并排序算法,包括了Ruby实现的合并排序算法的使用技巧和注意事项,需要的朋友参考一下 算法课的作业,利用分治法,合并排序。

  • 两个gif放到上面两个框中,合并成一个,需要自定义宽高,可能还是一个左半边,一个右半边,这个要怎么实现?

  • 问题内容: 在对重复的字符串进行排序时遇到问题, 这是我的代码。 我成功地对第一个数组进行了排序,但是在第二个数组中(使用重复的字符串)似乎输出不井井有条,您能帮助我追踪代码中的错误吗。 这是输出: … 问题答案: 更改 与 输出

  • 我正在python3中实现就地合并排序算法。如果输入数组的长度不止一个,则代码接受一个输入数组并自递归地调用它(将拆分数组作为输入)。然后,它将两个排序的数组连接起来。这是密码 现在如果代码经过测试, 如果在上述函数中取消对print语句的注释,您会注意到,a=给定的输出,就在最后一次调用join_sorted_数组之前。调用此函数后,应对数组“a”进行排序。令我惊讶的是,如果我执行以下操作,输出