簡體   English   中英

打印變量無法按預期工作-Java

[英]Printing variables doesn't work as expected - Java

我想計算快速排序算法中比較和交換的次數。 這是我的代碼:

public ArrayList<Integer> quickSort(ArrayList<Integer> data , int low , int high , int comparisons ,int swaps ){

    ArrayList<Integer> sortedData = new ArrayList<Integer>();

    if(low< high) {
        int pivotIndex = low; // Assume first element is the pivot
        int pivot = data.get(low);// The pivot value
        data.set(pivotIndex, data.get(high));// Swap pivot with last item

        data.set(high, pivot);
        int i = low - 1;
        int j = high;


        do {                
            do {i++;} while (data.get(i)< pivot);
            do {j--;} while (j>=0 && data.get(j)> pivot);
            comparisons ++ ;
            if (i < j) {
                int temp = data.get(i);
                data.set(i, data.get(j));
                swaps ++ ;
                data.set(j, temp);
                swaps ++ ;
            }  
        } while (i < j);

        data.set(high, data.get(i));  // Put the pivot back in the middle
        swaps ++ ;
        data.set(i, pivot);
        swaps ++ ;

        quickSort(data, low, i - 1 , comparisons , swaps);// Recursive sort left list
        quickSort(data, i + 1 ,high ,comparisons , swaps);// Recursive sort right list
    }

    System.out.println("Quick S swaps :   " + swaps);
    System.out.println("Quick S comparisons :   " + comparisons);

    sortedData = data;

    return sortedData ; 
}

盡管我將print語句放在循環和遞歸函數之后,但輸出是每個循環的交換和比較! 他們也增加直到一個特定的點,然后減少以返回到他們的起點!

Quick S swaps :   2
Quick S comparisons :   1
Quick S swaps :   4
Quick S comparisons :   2
Quick S swaps :   6
Quick S comparisons :   3
Quick S swaps :   8
Quick S comparisons :   4
Quick S swaps :   10
Quick S comparisons :   5
..
..
..
..
..
Quick S swaps :   2986
Quick S comparisons :   1493
Quick S swaps :   2988
Quick S comparisons :   1494
Quick S swaps :   2990
Quick S comparisons :   1495
Quick S swaps :   2992
Quick S comparisons :   1496
Quick S swaps :   2994
Quick S comparisons :   1497
Quick S swaps :   2998
Quick S comparisons :   1499
Quick S swaps :   2998
Quick S comparisons :   1499
Quick S swaps :   2998
Quick S comparisons :   1499
Quick S swaps :   2994
Quick S comparisons :   1497
Quick S swaps :   2992
Quick S comparisons :   1496
Quick S swaps :   2990
Quick S comparisons :   1495
Quick S swaps :   2988
Quick S comparisons :   1494
Quick S swaps :   2986
Quick S comparisons :   1493
..
..
..
..
..
Quick S swaps :   12
Quick S comparisons :   6
Quick S swaps :   10
Quick S comparisons :   5
Quick S swaps :   8
Quick S comparisons :   4
Quick S swaps :   6
Quick S comparisons :   3
Quick S swaps :   4
Quick S comparisons :   2
Quick S swaps :   2
Quick S comparisons :   1

為什么會這樣? 以及我該如何解決?

int comparisonsint swaps以及放置在調用堆棧上的局部變量。 每個對quickSort(ArrayList<Integer> data , int low , int high , int comparisons ,int swaps)調用quickSort(ArrayList<Integer> data , int low , int high , int comparisons ,int swaps)都有自己的這些變量副本。

每次進行遞歸調用時,都將這些變量的較高值傳遞給下一個調用,但是當遞歸調用返回時,您會看到這些變量的較早副本的較低值。

如果要使用單個comparisons變量和單個swaps變量,則可以使它們成為靜態對象,也可以使其成為包含quickSort方法的類的實例變量(並將它們從方法簽名中刪除)。

至於要多次打印的變量,您必須將println語句移到遞歸方法之外,因為該方法被多次調用,並且每次打印這些變量時都要調用該方法。

例如:

...

private int comparisons = 0;
private int swaps = 0;

public ArrayList<Integer> quickSort(ArrayList<Integer> data , int low , int high)
{
    ...
}

public printCounters()
{
    System.out.println("Quick S swaps :   " + swaps);
    System.out.println("Quick S comparisons :   " + comparisons);
}

....

someObj.quickSort(data, 0, data.size() - 1); // sort the list
someObj.printCounters(); // print the counters

作為替代方案,正如JB Nizet所說,您可以傳遞一些可變的計數器。

例如,一個int數組:

someObj.quickSort(data, 0, data.size() - 1, new int[]{0}, new int[]{0});

public ArrayList<Integer> quickSort(ArrayList<Integer> data , int low , int high , int[] comparisons ,int[] swaps)
{
    // here you change each comparisons++ to comparisons[0]++ 
    // and each swaps++ to swaps[0]++
    // you also print comparisons[0] and swaps[0]
}

暫無
暫無

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

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