背景:我想实现一个能够处理数组列表,链表和双向链表的选择排序。对于每个列表类型,我有一个位置{}和列表{}类。 position {}类是持有列表的东西(即类位置{int head; list tail;})。虽然LIST {}包含next(),previous(),end(),Insert(),first()方法并使用position {},但它不包含列表类本身,列表类本身构造列表被称为班级职位{}。
问题:我的问题不在于使选择排序兼容,我通过仅使用三个列表抽象数据类型之间常见的命令来实现这一点。 我的问题 是我的选择排序返回相同的列表并且没有排序。排序后打印的列表与排序前打印的列表相同。任何帮助表示赞赏。
输出 在选择排序之前 2 879 621 229 702 40 243 312 247 46 711 241 选择后排序 2 879 621 229 702 40 243 312 247 46 711 241
我的列表ADT是正确的,问题在于我糟糕的选择。
public static void SelectionSort(LIST A) {
POSITION i, j, maxp, temp;
for(i = A.Previous(A.End()); !i.isEqual(A.First()); i = A.Previous(i)) {
maxp = i;
for(j = A.First(); !j.isEqual(i); j = A.Next(j)) {
if((Integer)A.Select(j) > (Integer)A.Select(maxp)) {
maxp = j;
}
}
temp = i;
A.Insert(i, A.Select(maxp));
A.Insert(maxp, A.Select(temp));
A.Delete(maxp);
A.Delete(i);
}
}
答案 0 :(得分:1)
您首先在索引i
处插入内容,然后在索引maxp
处插入内容,然后删除索引maxp
处的内容,然后删除索引i
处的内容。假设Insert()
和Delete()
执行其名称所暗示的操作,这个操作序列会在循环的每次迭代后使列表处于初始状态,因为删除会撤消插入。
作为旁注,此代码不遵循Java的命名约定,这使得它更难以阅读。
答案 1 :(得分:0)
Insert
,Select
和Delete
方法如何运作? Delete
是否有可能删除您Insert
编辑的元素?
您是否确认isEqual
(以及上述方法)运算符的行为符合预期?
根据您的算法,我推断这是正在发生的事情:
0
到i
maxp
)插入索引i
的数组i
的元素插回到maxp
最初采用的位置的数组中i
和maxp
首先,为什么需要删除这些元素? Insert
复制元素吗?如果您在列表中调用Delete
,其中包含您要删除的元素的两个实例,它将删除哪一个?首先?这是你想要的吗?
也许您需要一个新方法Replace
来代替给定索引处的元素。然后你就不需要将它删除了。更好的是Swap
方法,它可以交换List中的2个元素。
更容易理解的解决方案甚至可能会创建一个新列表来存储元素,而不是执行排序。虽然这需要更多空间,但在短期内实施起来会更容易,一旦工作,您可以稍后对其进行优化。
答案 2 :(得分:0)
您只需要进行一次插入和一次删除。您应该在列表的未排序部分中搜索最小(或最大)元素,然后将其移动到列表的已排序部分的末尾。这是一次插入和一次删除。
还要注意删除正确的元素。如果在删除之前插入,则如果插入位于该位置之前,则要删除的正确索引可能会移一。
答案 3 :(得分:0)
这是正确的答案,它让我清醒的头脑,可能是由一杯好茶引起的,最后总结出来的东西......我的插入和删除方法是不对的,一点改变, wallah。干杯。感谢所有的回复。
public static void SelectionSort(LIST A) {
POSITION i, j, maxp, temp;
for(i = A.Previous(A.End()); !i.isEqual(A.First()); i = A.Previous(i)) {
maxp = i;
for(j = A.First(); !j.isEqual(i); j = A.Next(j)) {
if((Integer)A.Select(j) > (Integer)A.Select(maxp)) {
maxp = j;
}
}
temp = i;
A.Insert(A.End(), A.Select(maxp));
A.Delete(A.Previous(A.End()));
A.Insert(maxp, A.Select(temp));
A.Delete(temp);
}
}