Я пишу программу быстрой сортировки. Для этого мне нужно разбить массив. Разделение выполняется с помощью функции paritionIt()
. Я написал код разбиения массива, который выглядит следующим образом:C++ ⎼ Две аналогичные функции, но очень разные.
int partition(int beg,int end,double key)
{
int pLeft = beg;
int pRight = end-1;
while(pLeft<pRight)
{
while(array[++pLeft]<key);
while(array[--pRight]>key);
if(pLeft<pRight)
swap(pLeft,pRight);
}
swap(pLeft,end-1);
return pLeft;
}
Этот блок, кажется, работает, работает хорошо, когда выполняется в изоляции. Однако, когда он работал вместе с другими функциями, он, похоже, порождает неправильный ответ. Следующий код, предоставленный мне, устраняет все проблемы, но он не сильно отличается от моего кода.
int partitionIt(int left, int right, double pivot)
{
int leftMark = left; //right of first elem
int rightMark = right - 1; //left of pivot
while(true)
{
while(theVect[++leftMark] < pivot) //find bigger
; // (nop)
while(theVect[--rightMark] > pivot) //find smaller
; // (nop)
if(leftMark >= rightMark) //if pointers cross,
break; // partition done
else //not crossed, so
swap(leftMark, rightMark); //swap elements
} //end while(true)
swap(leftMark, right-1); //restore pivot
return leftMark; //return pivot location
} //end partitionIt()
Блок, похоже, похож на мой, но дает правильный ответ, в то время как мой не является. Не могли бы вы рассказать, какая разница между partition()
и partitionIt()
.
Итак, если вы замените свой код (первый блок) на второй блок, все ваши функции будут работать должным образом? – Kevin
Я не вижу никакой функциональной разницы между этими двумя частями кода. –
Да ... на самом деле, весь мой код соответствует коду, указанному в книге (за исключением имен переменных). – kusur