簡體   English   中英

Java鏈表字符串排序算法

[英]java linkedlist string sort algorithm

因此,我有幾個單詞對列表,我需要按升序或降序對其進行排序。 我現在使用的方法是插入排序算法。 這似乎適用於較小的列表。 但是每次我嘗試對大型列表進行排序時,它都會凍結,並且沒有錯誤。 我試圖通過調試打印出“ a被b交換”來查看發生了什么,您可以看到它開始工作並且變慢並最終停止,就像計算機剛剛說的那樣:“太多了,我放棄了”。 我的問題是,我的代碼是否有問題,還是我只需要使用一種更有效的方法?如果是,那是哪種方法?

for (int j=0; j < wordpair_list.size()-1; j++){
    for (int i=0; i < wordpair_list.size()-1; i++){
        String wordA_1 = wordpair_list.get(i).getWordA();
        String wordA_2 = wordpair_list.get(i+1).getWordA();

        if (wordA_1.compareToIgnoreCase(wordA_2) < 0){
            WordPair temp = wordpair_list.get(i);
            wordpair_list.set(i,wordpair_list.get(i+1));
            wordpair_list.set(i+1, temp);           
        }
    }
}

那是為了下降。 我要做的就是將if語句中的'>'交換為'<'

我認為您正在執行氣泡排序。 正如其他人指出的那樣,使用鏈表執行get()和set()操作非常昂貴。

我不熟悉Java,但是似乎可以使用ListIterators在O(N ^ 2)中進行冒泡排序

ListIterator listIterator(int index)從列表中的指定位置開始(按適當順序)返回此列表中元素的列表迭代器。 如果指定的索引超出范圍,則拋出IndexOutOfBoundsException(索引<0 ||索引> = size())。

對於冒泡排序,您只需要交換相鄰的元素,因此可以像數組一樣遍歷列表,並在需要時保持交換狀態。

此外,您可以跳過列表中已排序的部分。 看一個好的冒泡排序算法。 http://en.wikipedia.org/wiki/Bubble_sort

首先,這不是插入排序,這更接近氣泡排序。 其次,您的代碼沒有錯,但是對於這種排序算法,它是二次方的。 因此,對於較大的輸入,可能需要很長時間才能完成(例如,對於20萬個元素,可能需要幾分鍾)。

編輯:當您使用列表時,復雜度甚至更高-高達立方。 列表中set的值不是恆定的。 您可以嘗試使用Array來實現該算法,以節省這種增加的復雜性。

除了插入排序已經是O(N ^ 2)算法這一事實之外,通過項索引對鏈表中的項的訪問(獲取和設置)都是O(N)操作,從而使代碼為O(N ^ 3) ),也就是說速度非常慢

基本上,您有兩種選擇:

  • 將鏈接列表復制到臨時數組中,使用算法對數組進行排序(按索引對數組的訪問為O(1),總體算法將保持在O(N ^ 2)(除非您選擇更好的算法),然后創建新的排序后的數組數組中的鏈表。
  • 使用其他不需要索引訪問的算法(例如,實際上可以在沒有索引操作的情況下實現插入排序,因為您可以交換鏈表中的兩個相鄰項,因為您必須使用鏈表實現直接訪問“上一個”和“下一個”鏈接)。

暫無
暫無

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

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