InsertionSort在链接列表中,包含来自文本文件的数据。 Java的

时间:2017-06-04 00:20:29

标签: java sorting linked-list

我正在使用我的链接列表进行插入排序,我遇到了一个问题。

我的数据文件:

Myjob 66
Junk   17
Fun    25
Vital       99
Important   96
MoreFun    28
Work      69
Assignment  44

这是我的插入排序代码

public Node insertSort(Node node){
   Node sortedNode = null;
   while(node != null){
    Node current = node;
    node = node.next;
    Node x;
    Node previous = null;
    for(x = sortedNode; x != null; x = x.next){
        if(current.getData().getNum() > x.getData().getNum()){
                break;
         }
         previous = x;
    }
    if(previous == null){               
          current.next = sortedNode;
          sortedNode = current;
    }
    else{               
       current.next = previous.next;
       previous.next = current;
    }
  }
   sortedNode=head;
  return sortedNode; }

我目前的输出:

Name = Myjob            Priority=66
Name = Assignment            Priority=44
Name = MoreFun            Priority=28
Name = Fun            Priority=25
Name = Junk            Priority=17
null

他们跳过大于66的任何内容。有没有人有任何想法如何解决这个问题,所以它可以显示从99到17?我尝试重新排列文本文件中的顺序,最高的第一个。然后程序可以完美地从99回到17进行排序。但是使用原始订单,我的程序可以执行从66到最低的排序。我不知道为什么,以及如何解决它?请帮忙。我是Java的新手。非常感谢你。

我的数据类

public class Data {

private String name;
private int num;

public Data(){
}

public Data(String name,int num){
    this.name=name;
    this.num=num;
}

public String getName(){
    return name;
}

public void setName(String name){
    this.name=name;
}

public int getNum(){
    return num;
}

public void setNume(int num){
    this.num=num;
}

public String toString()
{
    return "Name = " + name + "            Priority=" + num ;
}

}

这是我的LinkedList类:

public class LinkedList {
Node head;
Node prev;
Node cur;


public LinkedList(){

}

public LinkedList(Node head){
    head = null;
}

//getter to get head
public Node gethead(){
    return head;
}

public void printLinkedList(){
    System.out.println(head);
}

public void initializeLL(){
    Node currentNode = head;
    try
    {
        File file = new File("Asg2Data.txt");
        Scanner sc = new Scanner(file);
        while (sc.hasNext())
        {
            Data d = new Data(sc.next(), sc.nextInt());
            Node n = new Node(d);

            if(currentNode == null){
                currentNode = n;
                head = n;
            }else{
                currentNode.setNext(n);
                currentNode = n;
            }
        }
        sc.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
}

public static void main(String[] args) throws FileNotFoundException{

        LinkedList l1 = new LinkedList();
        l1.initializeLL();
        l1.insertSort(l1.head); 
        l1.printLinkedList();
        System.out.println("************");
}
}

这是我的节点类:

public class Node{
Data dt;
Node next;

public Node(){

}
public Node(Data dt){
    this.dt=dt;
}


public Node getNext(){
    return next;
}

public void setNext(Node next){
    this.next=next;
}


public Data getData(){
    return dt;
}

public void setData(Data dt){
    this.dt=dt;
}


public String toString()
{
    StringBuilder sb = new StringBuilder();
    sb.append(dt).append(System.getProperty("line.separator")); 
    sb.append(next).append(System.getProperty("line.separator")); 

    return sb.toString();

}
}

insertSort方法位于LinkedList类中。

3 个答案:

答案 0 :(得分:1)

这里有几件事情要发生。首先,您的代码中存在一些错误,例如返回尚未更新的head。通过在列表中间开始迭代,这可以很容易地解释您所看到的行为。

更重要的是,这似乎不是对我的插入排序的实现。插入排序是通过在正确的点插入已排序的列表来完成的。所以看起来像:

sortedList Sort(unsortedlist):
   sortedList = []
   foreach item in unsortedlist:
     sortedList.InsertAtTheRighPlace(item)
   return sortedList

答案 1 :(得分:0)

您确定此处的代码是否正确? 我跟踪你的代码,我发现for循环不会运行,因为在每次insertSort()函数运行中x总是为空。

如何调用insertSort()函数对数据进行排序?

修改

确定。我检查你的代码。我发现你的排序是正确的但是在排序之后,LinkList的函数头没有更新。所以你的代码打印旧头的排序列表。 你应该在排序函数后更新链表的头部。

答案 2 :(得分:0)

好的所以下面的代码片段这是我的插入排序的代码正在做一些严肃的解决方法,我想即使你不能正确想象:)。

尝试将问题分解为更简单的步骤,你将如何实现一个LinkedList,你可以在升序或降序形式中添加一个整数(真的,只是OOP复杂度变化)。我刚刚测试的以下代码将帮助您了解如何实现通过InsertionSort algo 增长的 LinkedList,请注意这是处理升序情况下

public class LinkedList
{

    public Node first , last;

    public class Node
    {
        public int data;

        public Node next;

        public Node( int data )
        {
            this.data = data;
        }
    }

    public void addInsertSort( int num )
    {
        if( isEmpty() )
        {
            first = new Node( num );
            last = first;
        }
        else
        {
            Node newNode = new Node( num );
            Node curNode = first , preNode = null;
            while( curNode != null && newNode.data > curNode.data )
            {
                preNode = curNode;
                curNode = curNode.next;
            }
            if( curNode == first )
            {
                newNode.next = first;
                first = newNode;
            }
            else
            {
                if( curNode != null && preNode != null ) //middle of list
                {
                    newNode.next = curNode;
                    preNode.next = newNode;
                }
                else if( curNode == null ) // end of list
                {
                    preNode.next = newNode;
                    last = newNode; 
                }
            }
        }
    }

    public boolean isEmpty()
    {
        return first == null;
    }

    public String toString()
    {
        String str = "[";
        for( Node curNode = first; curNode != null; curNode = curNode.next )
        {
            str += curNode.data + " ";
        }
        return str + "]";
    }

    public static void main( String[] args )
    {
        LinkedList list = new LinkedList();

        list.addInsertSort( 4 );
        list.addInsertSort( 5 );
        list.addInsertSort( 1 );
        list.addInsertSort( 6 );
        list.addInsertSort( 10 );
        list.addInsertSort( 0 );

        System.out.println( list );
    }

}

对不起,这里的代码编辑真的很杀我,请不要介意频繁的重新编辑

现在继续讨论如何将这个想法整合到你的方法中,你可以修复这样的事情,并确保它看起来完全一样

// You really dont need more variables in your LinkedList class
// Both of these are enough, forget currentNode reference
public Node head , last;

public void initializeLL(){
    try
    {
        File file = new File("Asg2Data.txt");
        Scanner sc = new Scanner(file);
        while (sc.hasNext())
        {
            Data d = new Data(sc.next(), sc.nextInt());
            Node n = new Node(d);

            addInsertSort( n );
        }
        sc.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
}


public Node addInsertSort( Node newNode )
{
    if( isEmpty() )
    {
        head = newNode;
        last = head;
    }
    else
    {
        Node curNode = head , preNode = null;
        // This is How InsertionSort would have gone to search the list
        while( curNode != null && newNode.getData().getNum() > curNode.getData().getNum() )
        {
            preNode = curNode;
            curNode = curNode.next;
        }
        //Thats the happy ending of the insertionSort algo
        //Now we need to link newNode with OUR DYNAMICALLY GROWING LIST
        //When the insertion Algo stopped, It told us where the newNode 
        //shall be placed in comparison to the current state of list

        // Is this supposed to be the head node now??
        if( curNode == head )
        {
            newNode.next = head;
            head = newNode;
        }
        else // maybe we landed BETWEEN the list or at the END OF LIST??
        {
            if( curNode != null && preNode != null ) //BETWEEN THE list
            {
                newNode.next = curNode;
                preNode.next = newNode;
            }
            else if( curNode == null ) // end of list
            {
                preNode.next = newNode;
                last = newNode; 
            }
        }
    }
    return newNode; 
}

public boolean isEmpty()
{
    return head == null;
}

让我知道如果出现问题,我会更深入地解释