簡體   English   中英

如何使用LinkedList實現合並排序?

[英]How to implement merge sort using LinkedList?

我正在嘗試使用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的原始頭。 我相信該函數可以正確創建升序排序的LL。 顯示功能假定要打印LL。 在這種情況下,它僅從原始的打印頭(12)到分類的LL的末尾打印,並打印'12-> 34'。 我假設如果我可以通過新創建的已排序LL的頭部,那么它將能夠打印整個已排序的LL。

  1. 我的程序是否還可以,或者需要一些改進才能實現合並排序?
  2. 如何使排序后的LL的頭部通過顯示方法內部?

我想這是出於學術目的,因為Sandeep的評論是正確的,即LinkedList不是適合mergesort的數據結構。 並且編寫自己的鏈表也可能不是一個好主意,因為Java API數據結構經過了精心設計和測試!

但是對於您的代碼,它工作得很好! 唯一的錯誤是您沒有使用mergesort的結果,而是使用了“舊的”對head的引用。 如果您更新參考資料,那應該沒問題。 嘗試:

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

在您的主要方法中,它應該可以正常工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM