簡體   English   中英

Quicksort C ++第一個元素作為樞軸

[英]Quicksort c++ first element as pivot

我有這樣的事情,我想以第一個要素為樞軸。 為什么該程序仍然無法正常工作?

void algSzyb1(int tab[],int l,int p)
{
    int x,w,i,j;
    i=l;      //l is left and p is pivot, //i, j = counter 
    j=p;
    x=tab[l];   
    do
    {
        while(tab[i]<x) i++;
        while(tab[j]>x) j--;
        if(i<=j)
        {
            w=tab[i];
            tab[i]=tab[j];
            tab[j]=w;
            i++;
            j--;
        }           
    }
    while(!(i<j));
    if(l<j) algSzyb1(tab,l,j);
    if(i<p) algSzyb1(tab,i,p);
}

查看代碼,而不是真正檢查其功能,僅查看各行,這一行就很突出:

while(!(i<j));

我看着那條線,我想:這里有個bug。 我實際上沒有看過代碼,所以我不知道錯誤是什么,但是我看了一下這一行,它看起來是錯誤的。

我認為您需要在遞增i之前遞減j。

    while (tab[j]>x ) j--;
    while (tab[i]<x && i < j) i++;

另外,我還添加了一個額外條件,以確保我不會掃過j。 (未初始化的內存讀取)。

由於最終結果是一個已排序的元素,因此數據透視表的名稱略有錯誤,但這和Wikipedia頁面:quicksort都將數據透視表移至更高的分區,並且不能保證項目位於正確的位置。

結束條件是當您瀏覽列表時

while( i < j );  /* not !(i<j) */

在搜索結束時,您需要測試較小的集合。 您創建的代碼堆棧溢出,因為它反復嘗試了相同的測試。

  if (l<j) algSzyb1(tab, l, j);
  if (j+1<p) algSzyb1(tab, j+1, p);

完整代碼

void algSzyb1(int tab[], int l, int p)
{
    int x, w, i, j;
    i = l;
    j = p;
    x = tab[l]; //wróć tu później :D
    do
    {
        while (tab[j]>x ) j--;
        while (tab[i]<x && i < j) i++;
        if (i < j)
        {
            w = tab[i];
            tab[i] = tab[j];
            tab[j] = w;
            i++;
            j--;
        }
    } while ((i<j));
    if (l<j) algSzyb1(tab, l, j);
    if (j+1<p) algSzyb1(tab, j+1, p);
}

暫無
暫無

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

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