【问题标题】:ArrayLinkedList Insertion SortArrayLinkedList 插入排序
【发布时间】:2016-01-27 14:06:35
【问题描述】:

我必须为插入排序做一个数组列表,我的老师把这个发回给我,给了我一个 F,但说我可以在星期五之前完成。 我不明白为什么这不是 A.L 插入排序。 有人可以帮我解决这个问题,使其符合他的标准吗? 谢谢。

他说:

检查您的第一个插入排序后,您都做错了。我特别说过要移动数字并将数字移动到适当的位置,而不是将数字交换到适当的位置。在 MySA 的作业中,我说过如果你这样做,你的作业会得到 0。

 import java.util.ArrayList;

 public class AListINSSORT {

     private static void insertionSort(ArrayList<Integer> arr) {
          insertionSort();
     }

     private static void insertionSort() {
        ArrayList<Integer> swap = new ArrayList<Integer>();
        swap.add(1);
        swap.add(2);
        swap.add(3);
        swap.add(4);
        swap.add(5);

        int prior = 0;
        int latter = 0;

        for (int i = 2; i <= latter; i++)
        {
            for (int k = i; k > prior && (swap.get(k - 1) < swap.get(k - 2)); k--)  
            {
                Integer temp = swap.get(k - 2);
                swap.set(k - 2, swap.get(k - 1));
                swap.set(k - 1, temp);
            }
        }
        System.out.println(swap);
    }
 }

【问题讨论】:

  • 完全忽略其论点的insertionSort(ArrayList&lt;Integer&gt; arr) 方法的意义何在?
  • 它永远不会进入你的循环。

标签: java sorting arraylist insertion-sort


【解决方案1】:

首先,您的老师似乎要求您使用 LinkedList 而不是 ArrayList。它们之间有很大的不同。

其次,也许更重要。在您的内部循环中,您正在保存一个临时变量并相互交换位置 k - 2 和 k - 1 的元素。从评论来看,这不是你老师的本意。既然他要你解决元素插入的问题,我推荐你看一下LinkedList.add(int i, E e)的下面的方法定义:https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#add(int,%20E)

这应该为您指明正确的方向。

【讨论】:

    【解决方案2】:

    据我所知,您的代码根本没有做任何事情。 外层for循环的条件

    for (int i = 2; i <= latter; i++)
    

    未完成。

    当您以i = 2latter = 0 开头时,它永远不会保持i &lt;= latter。 因此,您永远不会运行外部 for 循环,最后只返回输入值。

    如果您以不同的顺序(尚未排序)将输入值添加到 swap,您将看到您的代码不会对它们重新排序。

    【讨论】:

    • 关于“不要将数字交换到位”,我认为您想做正确的事。您的两个 for 循环看起来好像您想插入数字而不是交换它。也许,您的老师只是对您列表中的名称swap 感到困惑。所以,考虑重命名它。
    【解决方案3】:

    这里有很多问题。

    首先,你的方法:

    private static void insertionSort(ArrayList<Integer> arr) {
       insertionSort();
    }
    

    接受一个 ArrayList 并完全忽略它。这应该是需要排序的List

    然后在insertionSort() 中创建一个新的 ArrayList,按顺序插入一些数字,然后尝试一些看起来不像插入排序但更像冒泡排序的东西。

    因此,当您调用 insertionSort(List) 时,它实际上根本不会对列表做任何事情,insertionSort() 中的所有工作都发生在一个完全不同的 List 上!

    由于在 SO 上我们通常不为人们做作业,我建议在 this page 上查看漂亮的小动画 diagram

    那么你应该拥有的是这样的:

    public void insertionSort(LinkedList<Integer> numbers) {
    
       //do stuff with numbers, using get() and add()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 2016-02-29
      • 1970-01-01
      相关资源
      最近更新 更多