簡體   English   中英

LinkedList的遞歸Quicksort

[英]Recursive Quicksort for a LinkedList

我一直在嘗試在使用LinkedList的算法中實現遞歸Quicksort。 但是,當我運行該方法時,即使只是一小部分(包含10個元素),它似乎也將永遠持續下去,我一直在等待該方法停止運行約10分鍾。

這是有問題的代碼

public static void QuickSort(LinkedList<Contacto> Lista, int ini, int fin){
    Contacto pivote, aux;
    int i, j, comp;


    if (ini<fin){
        pivote = Lista.get(ini);
        i=ini+1;
        j=fin;

        while (i<j){
            while(i<fin && (comp=Lista.get(i).get_name().compareTo(pivote.get_name()))<=0 )
                i++;

            while((comp=Lista.get(i).get_name().compareTo(pivote.get_name()))>0 )
                j--;

            if(i<j){
                aux = Lista.get(i);
                Lista.set(i, Lista.get(j));
                Lista.set(j, aux);
                }
            }
        aux=Lista.get(j);
        Lista.set(j,pivote);
        Lista.set(ini,aux);
        QuickSort(Lista,ini,j-1);
        QuickSort(Lista,j+1,fin);
    }
}

謝謝你的幫助!

正如評論中指出的那樣,對十個項目的列表進行排序需要花費十分鍾的時間是由於某個地方的錯誤所致,我建議您插入一些斷點/ println()語句以了解方法的執行方式(每個條件的頂部應該足以顯示掛斷的位置)。

就是說,非常短的列表效率低下是quicksort算法的一個已知問題-而且,如果您考慮一下該算法的工作原理,則可以了解為什么它是固有的。 (我可以對此進行詳細說明,但是如果您弄清楚自己為什么會這樣做會更好)。

解決此問題的常見方法是使用截止值 :當列表的大小變得小於截止值時,請切換到簡單的插入排序以完成工作。 有關於這一個很好的討論在這里 ,和一個很好的例子執行這里

請注意該示例中quicksort()方法的前幾行:

private static void quicksort(Comparable [] a, int left, int right) {
    final int CUTOFF = 3;
    if (right-left+1 < CUTOFF) { // if less than three elements remain: 
         insertionSort(a,left,right);
    else { //quicksort...

(注意:第一個鏈接來自普林斯頓大學一些人編寫的第四版算法書的網站。在您通過基本算法進行推理時,我不能推薦該站點足夠高)

暫無
暫無

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

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