繁体   English   中英

如何为通用 ArrayList 实现插入排序方法?

[英]How Do I Implement an Insertion Sort Method for A Generic ArrayList?

我打算创建一个简单的插入排序方法,该方法将一系列通用名称按字母顺序排序。 这应该很简单,我已经在线查看了许多其他插入排序示例,包括在这个站点上,但尽管将我的代码逐行与其他版本进行比较并且无法获得正确的输出,但我似乎仍然无法获得正确的输出确定我所做的与一些据称成功的插入排序方法不同。

以下代码是我不打算更改的主类:

  public static void main(String[] args) {
    GenericTools t = new ToolBox();
    ArrayList<String> data = new ArrayList<>();
    data.add("Carlos");
    data.add("Alice");
    data.add("Bob");
    data.add("Zebra");
    data.add("Fred");

    t.insertionSort(data);
    data.forEach(x -> System.out.println(x));
}

并且,这是上面引用的 GenericTools 接口,作为记录:

public <T> void swap(ArrayList<T> data, int p1, int p2);

最后,这是我应该正确排序此列表的代码:

@Override
    public <T extends Comparable<T>> void insertionSort(ArrayList<T> data) {
        int i, x =0;
        T key;
        for (i=1;i<data.size();i++){
            key= data.get(i);
            while (x>=0 && data.get(x).compareTo(key) > 0){
                data.set(x+1,data.get(i));
                x--;
            }
            data.set(x+1,key);
        }
      }

但是,会产生以下输出:

Fred
Alice
Bob
Zebra
Fred

与以下正确输出相反:

Alice
Bob
Carlos
Fred
Zebra

因此,您打算以降序遍历 ArrayList 的已排序部分(0 和 i - 1 之间的索引),并将相对大于key元素同时向右移动一个位置,并找到放置的正确位置key (data.get(i))。 你的算法是对的,但你犯了两个简单的错误:

  1. 您忘记在内部 while 循环之前将变量x初始化为i - 1

  2. 当当前元素按字母顺序大于key ,您应该将当前元素(data.get(x)) 向右移动一步,而不是data.get(i)

    @Override
    public <T extends Comparable<T>> void insertionSort(ArrayList<T> data) {
        int i, x =0;
        T key;
        for (i=1; i<data.size(); i++){
            key= data.get(i);
            x = i - 1; // set x to i - 1
            while (x >= 0 && data.get(x).compareTo(key) > 0){
                data.set(x+1, data.get(x)); // move data.get(x) instead of data.get(i).
                x--;
            }
            data.set(x+1,key);
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM