简体   繁体   中英

Sorting String Array Indicies with Insertion Sort, Doubly Linked List

I am working on an assignment where I have to sort an array and store the indices in a doubly linked list ADT that I have built.

Example:
{"A","B","C","A"} -> {0,3,1,2}

My current approach is to bring the indices into my ADT and then sort the ADT as I sort the array. As far as I can tell, I am doing the exact same operation on both the array and the doubly linked list every time either loop executes, but my output does not match up.

public static void main(String[] args ) {
    List A = new List();
    String[] inputArray = {"A","C","B","A"};
    int i,j;
    String key;
    //load indices into doubly-linked list
    for (int x = 0; x < inputArray.length; x++ ) {
        A.append(x);
    }
    //begin insertion sort
    for (j = 1; j < inputArray.length; j++) {
        System.out.println(A);
        System.out.println(Arrays.toString(inputArray));
        key = inputArray[j];
        i = j - 1;
        while (i >= 0) {
            if (key.compareTo(inputArray[i]) > 0) {
                break;
            }
            inputArray[i+1] = inputArray[i];
            //moveTo moves the cursor to <int>
            A.moveTo(i);
            //make sure we aren't trying to insert before first node
            if (i > 0) { A.insertBefore(i+1); }
            else { A.prepend(i+1); }
            //remove node at cursor
            A.delete();
            i--;
        }
        inputArray[i+1] = key;
        A.moveTo(i+1);
        if (i > 0) { A.insertBefore(i+1); }
        else { A.prepend(i+1); }
        A.delete();
    }
    System.out.println(A);
    System.out.println(Arrays.toString(inputArray));
}

The above code gives the following output:

run:
0 1 2 3
[A, C, B, A]
1 0 2 3
[A, C, B, A]
1 1 2 3
[A, B, C, A]
0 2 3 3
[A, A, B, C]
BUILD SUCCESSFUL (total time: 0 seconds)

EDIT: List.java

public class List {

    private class Node{
        //Fields
        int data;
        Node next, previous;
        //Constructor
        Node(int data) {
            this.data = data;
            next = null;
            previous = null;
        }
        public String toString() { return String.valueOf(data); }
    }

    //Fields
    private Node frontNode, backNode, cursorNode;
    private int totalSize, cursorPosition;

    //Constructor
    List() {
        frontNode = backNode = cursorNode = null;
        totalSize = 0;
        cursorPosition = -1;
    }
    //moveTo(int i): If 0<=i<=length()-1, moves the cursor to the element 
    // at index i, otherwise the cursor becomes undefined.
    void moveTo(int i) {
        if (i == 0) {
            cursorPosition = i;
            cursorNode = frontNode;
        }
        else if (i == length() - 1) {
            cursorPosition = i;
            cursorNode = backNode;
        }
        else if (i > 0 && i < length() - 1 ) {
            cursorNode = frontNode;
            cursorPosition = i;
            for (int x=0; x < i; x++) {
                cursorNode = cursorNode.next;
            }
        }
        else {
            cursorPosition = -1; 
        }
    }

//prepend(int data): Inserts new element before front element in this List.
    void prepend(int data) {
        Node node = new Node(data);
        if ( this.length() == 0 ) {
            frontNode = backNode = node;
        }
        else {
            frontNode.previous = node;
            node.next = frontNode;
            frontNode = node;
        }
        totalSize++;
        //cursorPosition might change?
    }
    //insertBefore(int data): Inserts new element before cursor element in this
    // List. Pre: length()>0, getIndex()>=0
    void insertBefore(int data) {
        Node node = new Node(data);
        if ( this.length() > 0 && this.getIndex() >= 0 ) {
            node.previous = cursorNode.previous;
            node.next = cursorNode;
            cursorNode.previous.next = node;
            cursorNode.previous = node;
            totalSize++;
        }
        else if ( this.length() <= 0 )
        {
           throw new RuntimeException
                    ("Error: insertBefore called on empty list");
        }
        else {
            throw new RuntimeException
                    ("Error: insertBefore called without cursor set");
        }
    }

OK, thanks. I didn't know exactly what insertBefore() and prepend() were intended to do (I could have guessed, but programming should not be about guessing what methods are supposed to do; seeing the documentation is much better).

Since this is an assignment, I'm not going to give you the answer. But the clue is this: After the first pass through the loop, the dump of A gives you the same indices you started with, but rearranged. I think that's the way it's supposed to be after every loop iteration. But that's not true after the second pass through the loop (1 shows up twice, and 0 is gone). Think about it. When you called A.insertBefore() to rearrange the elements of A, what data should you have told insertBefore() to insert, and what did you actually insert?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM