簡體   English   中英

使用Java的鏈表合並排序

[英]Linked list merge sort using java

我想使用Java僅使用鏈接列表而不使用任何數組來實現合並排序。 但是我陷入了邏輯錯誤; 我的代碼消除了一些輸入並對剩余部分進行排序。 我已經應用了三個類: DivideMergMergSort ,如下所示:

public class Divide {

    List firstList = new List();
    List secondList = new List();

    public int GetLength(List list) {
        int Length = 0;
        Link temp = new Link();
        temp.next = list.head.next;
        while (temp.next != null) {
            temp.next = temp.next.next;
            Length++;
        }

        return Length;
    }

    public List rightSide(List list) {
        int Length = GetLength(list);
        Link temp = new Link();
        temp.next = list.head.next;

            for (int i = 1; i <= Math.floor(Length / 2); i++) {
                firstList.Insert(temp.next.data);
                temp.next = temp.next.next;
            }
            return firstList;
    }

    public List leftSide(List list) {
        int Length = GetLength(list);
        Link temp = new Link();
        temp.prev = list.head.prev;

            for (int i = 1; i <= Math.ceil(Length / 2); i++) {
                secondList.Insert( temp.prev.data);
                temp.prev =  temp.prev.prev;
            }
            return secondList;
        }
    }

合並:

public class Merg {

    public List MergedList = new List();
    private  List Temp = new List();

    public List Merg (List one, List two)
    {
        Link onelink = new Link();
        Link twolink = new Link();

        onelink.next = one.head.next;
        twolink.next = two.head.next;

        while (onelink.next!= null || twolink.next!= null)
        {

            if(onelink.next!= null && twolink.next != null)
            {
              if(onelink.next.data < twolink.next.data)
              {
                  Temp.Insert(onelink.next.data);
                  onelink.next = onelink.next.next;
              }
              else
              {
                  Temp.Insert(twolink.next.data);
                  twolink.next = twolink.next.next;
              }

            }

            if (onelink.next != null && twolink.next == null)
            {
                Temp.Insert(onelink.next.data);
                onelink.next = onelink.next.next;
            }
            if (twolink.next != null && onelink.next == null)
            {
                Temp.Insert(twolink.next.data);
                twolink.next = twolink.next.next;
            }

        }

        if (Temp.head.next.data > Temp.head.prev.data)
        {
            while (Temp.head.next != null)
            {
                MergedList.Insert(Temp.head.next.data);
                Temp.head.next = Temp.head.next.next;
            }
        }

        else
        {
            MergedList.head.next = Temp.head.next;
        }


        return MergedList;
    }

}

MergSort:

public class MergSort {

    public List mergSort (List list)
    {
        Divide divide = new Divide();
        Merg merg = new Merg();

        if (divide.GetLength(list) > 1) {
            return merg.Merg(mergSort(divide.leftSide(list)), mergSort(divide.rightSide(list)));
        }
        else
        {
            return list;
        }
    }
}

盡管我也編寫了linklist類,但我認為其中沒有麻煩。 (但是,如果有必要,我會提及它們)現在,當我導入一些輸入,例如:{100,3,1,7,6}時,輸出為:3,6,7,100。 (已消除1!)或另一個示例:{100,3,1}輸出為:1,100(其中3是??)

我想知道是否有人可以幫助我...

鏈接:

public class Link {
    public double data;
    public Link prev;
    public Link next;
}

清單:

public class List {
    public Link head = new Link();

    public void setHead(Link head) {
        this.head = head;
        head.prev = null;
        head.next = null;
    }

    public void Insert(double x)
    {
        Link link = new Link();
        link.data = x;
        if (head.next == null)
        {
            head.next = link;
            head.prev = link;
        }
        else
        {
            head.next.prev = link;
            link.next = head.next;
            head.next = link;
        }
    }

    public Link delete()
    {
        Link temp = new Link();
        temp = head;
        head = head.next;
        return temp;
    }

    public Link search(double x)
    {
        Link link = new Link();
        link.next = head;
        while (link.next.data != x)
        {
            link.next = link.next.prev;
        }

        return link.next;
    }
}

我已經調試了很多東西,但是我對您的Divide課堂還是沒什么意思。 您根本不需要它。

public class MergSort {

    public List mergSort(List list) {
        Divide divide = new Divide();
        Merg merg = new Merg();
        int n = list.getLength();
        if (n > 1) {
//            return merg.Merg(mergSort(divide.leftSide(list)), mergSort(divide.rightSide(list)));
            Link cursor = list.head.next;
            List left = new List();
            List right = new List();
            // for (i = 0; ....... i will be 0 if head is not dummy
            for (int i = 1; cursor != null; i++) {
                if (i <= n/2)
                    left.Insert(cursor.data);
                else
                    right.Insert(cursor.data);
                cursor = cursor.next;
            }
            left = mergSort(left);
            right = mergSort(right);

            return merg.Merg(left, right);

        } else {
            return list;
        }
    }
}

List類中創建一個getLength()方法。 它應該在List類中,因為您需要列表的長度。

public int getLength() {
    int Length = 0;
    Link temp = head.next;
    while (temp != null) {
        temp = temp.next;
        Length++;
    }

    return Length;
}

另外,將您的Link類重命名為Node 因為Link是指對象之間的鏈接或節點之間的邊。 您真正想要的是一個Node 令人困惑。

List類中,您已經定義了head如下所示:

public Link head = new Link();

我不明白為什么您需要一個假名的鏈表

具有虛擬頭的鏈表基本上是沒有值的頭,因此是虛擬的。

在此處輸入圖片說明

由於您的虛擬頭,您正在從i = 1開始在Divide類中進行for循環。 為什么使事情復雜化? 如果您確實需要虛擬頭,則保留它或像這樣定義它:

public Link head;
// don't instantiate the head. It's just a reference

另外,您似乎創建了一個半圓形的鏈表。 我的意思是head.prev指向列表中的最后一個鏈接/節點。 如果您確實想要一個圓形鏈表,則將tail.next指向head。

循環鏈表如下所示:

在此處輸入圖片說明

或者,如果您不需要循環列表,則不要將head.prev指向最后一個對象。

List.java Insert()方法中:

if (head.next == null)
{
    head.next = link;
    // remove head.prev = link;
}

暫無
暫無

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

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