实现一个能够处理java中的数组列表,链表和双向链表的SelectionSort

时间:2014-04-15 18:37:06

标签: java list arraylist doubly-linked-list selection-sort

背景:我想实现一个能够处理数组列表,链表和双向链表的选择排序。对于每个列表类型,我有一个位置{}和列表{}类。 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);
        }
    }

4 个答案:

答案 0 :(得分:1)

您首先在索引i处插入内容,然后在索引maxp处插入内容,然后删除索引maxp处的内容,然后删除索引i处的内容。假设Insert()Delete()执行其名称所暗示的操作,这个操作序列会在循环的每次迭代后使列表处于初始状态,因为删除会撤消插入。

作为旁注,此代码不遵循Java的命名约定,这使得它更难以阅读。

答案 1 :(得分:0)

InsertSelectDelete方法如何运作? Delete是否有可能删除您Insert编辑的元素?

您是否确认isEqual(以及上述方法)运算符的行为符合预期?

根据您的算法,我推断这是正在发生的事情:

  • 你循环遍历所有元素,从倒数第二个开始,向前移动。
    • 找到子集中从0i
    • 的最大元素
    • 将找到的最大元素(在索引maxp)插入索引i的数组
    • 将原始位于索引i的元素插回到maxp最初采用的位置的数组中
    • 删除imaxp

首先,为什么需要删除这些元素? 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);
    }
}