簡體   English   中英

數組中間具有隨機樞軸的Quicksort算法

[英]Quicksort algorithm with random pivot in the middle of the array

我必須編寫一個帶有隨機軸的quicksort-algorithm,所以我創建了以下代碼:

public void quickSort(int left, int right)
{
    if(a.length == 1)
    {
        System.out.println("Only one element.");
    }
    else
    {
        int l = left;
        int r = right;
        if(right > left)
        {
            Random rand = new Random();
            int num = left + rand.nextInt(right - left);
            int p = a[num];

            int tmp = a[r];
            a[r] = a[num];
            a[num] = tmp;
            num = r;
            r--;


            while(r > l)
            {
                while((l<right)&&(a[l]<=p))
                {
                    l++;
                }
                while((r > left)&&(a[r]>=p))
                {
                    r--;
                }
                if(l < r)
                {
                    tmp = a[l];
                    a[l] = a[r];
                    a[r] = tmp;
                }
            }

            if(a[l] > p) {
                tmp = a[l];
                a[l] = a[num];
                a[num] = tmp;
            }

            quickSort(left,l-1);
            quickSort(l+1,right);
        }

       }
    }

“ a”應該是一個int數組。 如您所見,當我得到隨機數據透視表時,便立即將其與數組的最后一個元素交換,這樣我就不會在算法上遇到任何問題,但是我想知道是否有可能讓數據透視表停留在它的位置不過,您可以隨意定位並對其進行排序。 提前謝謝。

就在這里。 基本上,我們可以使不等式更嚴格:將a[l]<=p更改為a[l]<p ,將a[r]>=p更改為a[r]>p 當數組中也可以有相等的元素時,這將有助於處理情況,因此您可以擺脫l<rightleft<r條件。

樞軸不能保證精確地降落在位置l ,但a[left...l]仍為<=pa[l+1...right]則為>=p ,這僅僅是足以使算法起作用。

這是您的代碼的一種變體。 條件if(l < r)修改為if(l <= r) ,並且在內部, l++; r--; 添加以跳過我們剛剛交換的兩個元素。 另外,由於現在沒有樞軸元素的保證位置,因此將遞歸調用更新為(left,r)(l,right)

public void quickSort(int left, int right)
{
    if(a.length == 1)
    {
        System.out.println("Only one element.");
    }
    else
    {
        int l = left;
        int r = right;
        if(right > left)
        {
            Random rand = new Random();
            int num = left + rand.nextInt(right - left);
            int p = a[num];

            while(r > l)
            {
                while(a[l]<p)
                {
                    l++;
                }
                while(a[r]>p)
                {
                    r--;
                }
                if(l <= r)
                {
                    int tmp = a[l];
                    a[l] = a[r];
                    a[r] = tmp;
                    l++;
                    r--;
                }
            }

            quickSort(left,r);
            quickSort(l,right);
        }
    }
}

暫無
暫無

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

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