使用插入排序对链接列表进行排序

时间:2014-05-15 14:09:28

标签: java sorting linked-list

我必须设计自己的插入排序,但我使用javas链表。

private static void insertionSort( LinkedList<Integer> data, int first, int last ){
    System.out.println("insertion sort");
    ListIterator itr = data.listIterator(first+1);
    int count = first+1;
    while (count<=last){//itr.hasNext() &&  
        ListIterator itr2 = data.listIterator(itr.nextIndex()-1);
        int tmp = (Integer) itr.next();
        while( itr2.hasPrevious() && tmp < (Integer)itr2.previous()){
            itr2.next();
            itr2.set(itr2.previous());
        }
        data.set(itr2.nextIndex(), tmp);
        count++;
    }

它最终会对链接列表的各个部分进行排序,但是现在我只是将整个列表传递给它并尝试。它似乎是插入到列表中然而它不会移动列表中的东西。我觉得我真的很亲近。有没有人有任何指示?

1 个答案:

答案 0 :(得分:0)

我相信在你的实施过程中,你正在做一些“怪异的事情”。当你调用set时,有迭代器的东西。将它们用于此类应用并不是“#34;必要的,因为 LinkedList 类提供的方法包括 size get set

根据您尝试做的事情并查看插入排序算法伪代码 here ,我写了这个方法:

public static void insertionSort(LinkedList<Integer> linkedList, int first, int last) {
        for (int i = 2; i <= last; i++) {
            for (int k = i; k > first
                    && (linkedList.get(k - 1) < linkedList.get(k - 2)); k--) {
                Integer temp = linkedList.get(k - 2);
                linkedList.set(k - 2, linkedList.get(k - 1));
                linkedList.set(k - 1, temp);
            }
        }
    }

但是,这种方法有两个限制有两个限制:

  1. 1&lt; = first
  2. last&lt; = linkedList.size()
  3. <强>示例:

    对整个链表进行排序:
    输入: LL = [2,1,8,6,4,0,3,9,5,7]
    致电: insertionSort(LL,1,ll.size())
    输出 [ 0 1 2 3 4 5 6 7 8 9 ]

    对链接列表中的前四个元素进行排序:
    输入: LL = [2,1,8,6,4,0,3,9,5,7]
    致电: insertionSort(LL,1,4)
    输出 [ 1 2 6 8 ,4,0, 3,9,5,7]

    对链接列表中的最后2个元素进行排序:
    输入: LL = [2,1,8,6,4,0,3,9,5,7]
    致电: insertionSort(LL,9,LL.size())
    输出 [2,1,8,6,4,0,3,9, 5 7 ]

    对链接列表中的4个元素进行排序:
    输入: LL = [2,1,8,6,4,0,3,9,5,7]
    致电: insertionSort(LL,3,6)
    输出 [2,1, 0 4 6 8 , 3,9,5,7]