簡體   English   中英

使用插入排序對鏈表進行排序

[英]Sorting a linked list using insertion sort

我必須設計自己的插入排序,但是我使用的是Java鏈表。

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++;
    }

它最終將對鏈接列表的各個部分進行排序,但是現在我只是將整個列表傳遞給它並進行嘗試。 它似乎正在插入列表中,但不會將列表中的內容移回列表中。 我覺得我真的很近。 有人有指針嗎?

我相信在實現中,當您調用set時,您在使用迭代器來做一些“怪異”的事情。 將它們用於此類應用程序不是必需的,因為LinkedList類提供了諸如sizegetset之類的方法。

根據您嘗試執行的操作並在此處查看插入排序算法的偽代碼,我編寫了以下方法:

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 <=首先
  2. 最后一個<= linkedList.size()

例子:

排序整個鏈表:
輸入: LL = [2、1、8、6、4、0、3、9、5、7]
呼叫: insertSort(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]
呼叫: insertSort(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]
呼叫: insertSort(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]
呼叫: insertSort(LL,3,6)
輸出:[2,1,0,4,6,8,3,9,5,7]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM