[英]Sorting String Array Indicies with Insertion Sort, Doubly Linked List
我正在做一个作业,在该作业中,我必须对数组进行排序并将索引存储在已构建的双向链接列表ADT中。
Example:
{"A","B","C","A"} -> {0,3,1,2}
我当前的方法是将索引放入ADT中,然后在对数组进行排序时对ADT进行排序。 据我所知,每次循环执行时,我都会在数组和双向链表上执行完全相同的操作,但是我的输出不匹配。
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));
}
上面的代码提供以下输出:
跑:
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]
建立成功(总时间:0秒)
编辑: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");
}
}
好,谢谢。 我不确切知道打算要执行insertBefore()和prepend()(我可能已经猜到了,但是编程不应该是猜测应该做什么方法;看文档会更好)。
由于这是一项任务,因此我不会给您答案。 但是线索是这样的:在第一次通过循环之后,A的转储会为您提供与开始时相同的索引,但是会重新排列。 我认为这就是每次循环迭代后的方式。 但这在第二次通过循环之后是不正确的(1出现两次,而0消失了)。 想一想。 当你打电话A.insertBefore()来重新排列的元素,什么样的数据,你应该告诉的insertBefore()来插入,是什么?你居然插入?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.