【发布时间】:2015-11-12 23:35:43
【问题描述】:
我有一个带有哨兵节点的双向链表,我需要使用 O(n^2) 复杂度的插入排序对其进行排序。我已经编写了这段代码,但它没有按预期工作。
对插入排序有什么帮助,特别是对代码有帮助吗?
public void insertionSort()
{
int key,i;
int size = getSize();
this.restart();
for(i = 2; i < size; i++)
{
this.next(); // Go to next node
key = this.getVar(); // get the integer a node holds
while(this.hasNext() == 1 && position.prev.var < key && position.var != -1)
{
position.prev.setNext(position.next);
position.next.setPrev(position.prev);
position.setNext(position.prev);
position.setPrev(position.prev.prev);
position.prev.setNext(position);
position.next.setPrev(position);
this.goBack(); // go to the previous node
}
}
}
大小是我的列表有多少元素。我的哨兵有 var = -1 所以我想在我领先时停下来,这就是我使用它的原因。
position.var != -1
并且this.hasNext() == 1 是真的,只要我们在一个位置 != sentinel node 。
在具体示例中,我的列表中有 35 个整数:
5 9 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1
我想这样对它们进行排序:
9 5 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
更新: 我在插入排序中使用的代码如下:
public int getSize()
{
int size = 0;
this.restart();
while(this.hasNext() == 1)
{
size++;
this.next();
}
return size;
}
public void restart()
{
position = header;
previous = Sentinel;
}
public void next()
{
previous = position;
position = position.next;
}
public int getVar()
{
return position.var;
}
public void goBack()
{
position = previous;
previous = previous.prev;
}
public int hasNext()
{
if(position.var != -1)
return 1;
else
return 0;
}
public void setNext(Node next)
{
this.next = next;
}
public void setPrev(Node prev) { this.prev = prev; }
另外,我使用列表迭代器。
【问题讨论】:
-
澄清一下,第一个数列是你排序后的?
-
不,当我将它们添加到列表时,它是未排序的。在完成添加后,我需要使用插入排序对列表进行排序。
-
排序后的输出是什么?
-
您需要发布更多资源以供他人帮助。 goBack()、getRequest() 和 hasNext() 究竟是做什么的?
-
顺便说一句,你永远不会更新
position(或定义它),所以position.var != -1总是相同的值,表明它要么根本不排序,要么永远不会终止(或者可能在之间)。
标签: java sorting insert linked-list insertion-sort