[英]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.