簡體   English   中英

Java中的冒泡排序混亂

[英]Bubble sort confusion in Java

我有一個關於使用數組進行冒泡排序的問題。 這是一些示例代碼:

public class SortArray 
{
    public static void main(String[] args)
    {
        int[] arr = {4,6,4,2,764,23,23};
        sort(arr);
    }
    static void sort(int[] arr)
    {
        int k;
        for(int i = 0; i < arr.length; i++) { for(int j = i; j < arr.length-1; j++) {
                if(arr[i] < arr[j+1])
                {
                    k = arr[j+1];
                    arr[j+1] = arr[i];
                    arr[i] = k;
                }
            }
            System.out.print(arr[i] + " ");
        }   
    }
}

有兩個檢查數組的循環,我知道第一個循環是遍歷數組中的每個元素,但是第二個循環又如何呢? 為什么ji開始,為什么長度達到負1?

另外,我可以使用冒泡排序對ArrayList進行排序嗎?

您所擁有的稱為選擇排序 ,而不是冒泡排序

冒泡排序僅交換相鄰的元素,但是您將遍歷數組的其余部分並找到最小值,這正是選擇排序所要做的。

由於您使用arr[j+1] ,因此可以重寫內部循環以使用arr[j]並將范圍向上移動一個,如下所示:

for(int j = i + 1; j < arr.length; j++)
{
    if(arr[i] < arr[j])
    {
        k = arr[j];
        arr[j] = arr[i];
        arr[i] = k;
    }
}

現在,您可以清楚地看到彼此之間剩余的元素以找到最小值。

是的,您可以修改任何適用於數組的排序方式來對ArrayList排序,而只需使用ArrayList.get而不是數組訪問和ArrayList.set而不是數組分配即可,即:

for(int i = 0; i < arr.size(); i++)
{
    for(int j = i + 1; j < arr.size(); j++)
    {
        if(arr.get(i) < arr.get(j))
        {
            int k = arr.get(j);
            arr.set(j, arr.get(i));
            arr.set(i, k);
        }
    }
}

請注意,選擇排序和冒泡排序都效率很低( O(n^2) ), 還有更高效的排序算法,例如快速排序或合並排序(在O(n log n) )。

第一個循環在i保存一個元素,第二個循環檢查i之后的每個元素,即j ,並將其與已保存的i進行比較。 如果可以交換它們,則算法交換其位置並繼續前進。 當外循環完成一次迭代時,對i之前的所有元素進行排序,因此ji開始。

只需在紙上做一次,這一切都是有道理的。

編輯 :完成算法后,第二個循環條件的原因是您將ij+1交換。 因此,如果您的j繼續到數組的最后一個元素,則下一個元素將不存在並引發異常。 您也可以使用此代碼對ArrayList進行排序。 只需使用適當的setter和getter更改代碼交換值即可。

暫無
暫無

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

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