插入排序链表

时间:2016-05-09 21:43:37

标签: java linked-list insertion-sort

我正在尝试编写插入排序方法,但我无法达成协议。下面是我到目前为止的代码,我似乎无法让算法正常工作。 RecordList类包含链表的所有方法。具体而言,Sort()适用于用户定义的对象Student,其中学生按ID numbers

排序
public class RecordList {

    private Link first;     //ref to first item 
    private Link last;      //ref to last item
    int count = 0;          //count number of elms in list

    //constructor
    public RecordList(){
        first=null;
        last=null;
    }

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

    //insert first
    public void insertFirst(Student dd){
        count++;

        Link newLink = new Link(dd); // make new link
        if( isEmpty() ){ // if empty list,
            last = newLink; // newLink <-- last
        } 
        else{
            first.previous = newLink; // newLink <-- old first
            newLink.next = first; // newLink --> old first
            first = newLink; // first --> newLink
        }
    }

    //insert last
    public void insertLast(Student dd){
        count++;

        Link newLink = new Link(dd); // make new link
        if( isEmpty() ){ // if empty list,
            first = newLink; // first --> newLink
        }
        else{
            last.next = newLink; // old last --> newLink
            newLink.previous = last; // old last <-- newLink
        }
        last = newLink; // newLink <-- last
    }

    //delete first
    //ASSUMES NOT EMPTY
    public Link deleteFirst(){
        count--;

        Link temp = first;
        if(first.next == null){ // if only one item
            last = null; // null <-- last
        }
        else{
            first.next.previous = null; // null <-- old next
            first = first.next; // first --> old next
        }
        return temp;
    }

    //delete last
    //ASSUMES NOT EMPTY
    public Link deleteLast(){
        count--;

        Link temp = last;
        if(first.next == null){ // if only one item
            first = null; // first --> null
        }
        else{
            last.previous.next = null; // old previous --> null
            last = last.previous; // old previous <-- last
        }
        return temp;
    }

    public boolean insertAfter(Student key, Student dd){ // (assumes non-empty list)
        Link current = first; // start at beginning
        while(current.dData != key){ // until match is found,
            current = current.next; // move to next link
            if(current == null){
                return false; // didn’t find it
            }
        }
        Link newLink = new Link(dd); // make new link
        if(current==last){ // if last link,
            newLink.next = null; // newLink --> null
            last = newLink; // newLink <-- last
        }
        else{ // not last link,
            newLink.next = current.next; // newLink --> old next
            // newLink <-- old next
            current.next.previous = newLink;
        }
        newLink.previous = current; // old current <-- newLink
        current.next = newLink; // old current --> newLink
        return true; // found it, did insertion
    }

    //self algorithm
    public void Sort(){
        Link marker = first;
        Link current = null;
        Link temp;

        //if more than one elm sort
        if(count > 1){
            marker = marker.next;

            //outer loop
            //until end of list
            while(marker != null){
                current = marker.previous;
                temp = marker;

                //inner loop
                //until position found
                while(temp.dData.getID() > current.dData.getID()){
                    if(current == marker.previous){
                        marker = marker.next;
                    }
                    else{
                        marker = marker.next;

                        //remove temp from original position
                        if(temp.next == null){
                            last = temp.previous;
                            last.next = null;
                        }
                        else{
                            temp.previous.next = temp.next;
                            temp.next.previous = temp.previous;
                        }

                        //check to see if inserting to first elm or not
                        if(current == null){
                            //insert temp to first
                            //*****CHECK ALGORITHM*****\\
                        }
                        else{
                            //insert temp to current.next
                            temp.next = current.next;
                            temp.previous = current;
                            current.next.previous = temp;
                            current.next = temp;
                        }
                    }
                }
                //while/else DOES not work
                else{
                    //if while condition not met
                    current = current.previous;

                    if(current == null){
                        //break to outer
                    }
                    else{
                        //break to inner
                    }
                }
            }
        }
    }

    //display
    @Override
    public String toString(){
        String s="";
        Link current = first;
        while(current != null){
            s += current.dData+"\n"+"\n";
            current = current.nextLink();
        }
        return s;
    }
}   

1 个答案:

答案 0 :(得分:0)

抱歉,您的代码看起来不必要复杂。此外,您的代码包含的代码不仅仅是“排序”和“#39;您的问题所依据的。如果&#34;排序&#34;是你的关注点,试试这个。 否则请随意关注此答案,因为Stack Overflow仅用于帮助您清除概念,然后调试自己的代码。

这是用于插入排序的短而甜的代码(使用数组和JavaScript轻松检入浏览器控制台)。在浏览器控制台中查看它。一旦你明确了这个想法,就把它扩展为Linked List。尽量保持简单,你会发现你的错误,

var a = [3,1,5,57,9,12,91,45,65,67,89,21,13,56,76,32,77,89,71];
console.log('array before sort...' + a);

//The Insertion Sort
for(var i=1; i<a.length; i++) {
  var j = i-1;
  var key = a[i];
  while(j>=0 && a[j] > key) {
    a[j+1] = a[j];
    j--;
  }
  a[j+1] = key;
}



console.log('array after sort...' + a);

只需按F12即可在浏览器中打开控制台。粘贴此代码并按Enter键。玩它来了解更多。

祝你好运!