簡體   English   中英

如何使用固定樞軸將迭代快速排序更改為使用隨機數據塊的迭代快速排序?

[英]How do I change iterative quicksort with fixed pivot to iterative quicksort with random pivot?

我發現這個代碼用於帶有固定樞軸的快速排序。 它總是將給定表的右側元素作為一個軸。 我希望它將隨機元素作為一個支點。 我認為x是這里的一個支點,所以我認為將它從給定列表中更改為隨機元素是一個好主意,但事實證明它不起作用。

void swap ( int* a, int* b )
{
    int t = *a;
    *a = *b;
    *b = t;
}


int partition (int arr[], int l, int h)
{
    int x = arr[h];
    int i = (l - 1);
    for (int j = l; j <= h- 1; j++)
    {
        if (arr[j] <= x)
        {
            i++;
            swap (&arr[i], &arr[j]);
        }
    }
    swap (&arr[i + 1], &arr[h]);
    return (i + 1);
}

void quickSortIterative (int arr[], int l, int h)
{
    int stack[ h - l + 1 ]; 
    int top = -1;

    stack[ ++top ] = l;
    stack[ ++top ] = h;

    while ( top >= 0 )
    {
        h = stack[ top-- ];
        l = stack[ top-- ];

        int p = partition( arr, l, h );

        if ( p-1 > l )
        {
            stack[ ++top ] = l;
            stack[ ++top ] = p - 1;
        } 
        if ( p+1 < h )
        {
            stack[ ++top ] = p + 1;
            stack[ ++top ] = h;
        }
    }
}

我嘗試換線

int x = arr[h];

swap(&arr[i+1], &arr[j]);

int r = l+rand()%(h-l);
int x = arr[r];

接着

swap(&arr[i+1], &arr[r]);

但它沒有正確排序。 顯然我在這里做錯了。 請幫忙。

您的分區函數假定數據透視表位於分區的末尾。 考慮首先將隨機數據移動到分區的末尾。

即添加

swap(&arr[r], &arr[h]);

選擇你的支點后。

問題是'partition'函數現在移動了pivot,所以它不會保留在r索引處。 並且該函數也會錯過最后一個元素(在索引h )。 最簡單的解決方案是在選擇它之后將樞軸放在最右邊的位置,並保持其他一切相同:put swap(&arr[r], &arr[h]); partition()的第一個循環之前,將最后一個交換恢復為swap (&arr[i + 1], &arr[h]);

暫無
暫無

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

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