我將QuickSort的當前實現設置爲數組中的最後一個元素,導致堆棧溢出異常。將它設置爲中間元素,或者最左邊,可以正常工作,但不是正確的。我真的想明白爲什麼。爲什麼在QuickSort實現中將大部分元素設置爲最右邊的元素不起作用?
我目前正在學習數據結構和算法,我真的很想了解算法如何工作的複雜性。我試過了下面的問題,但遞歸正在殺死我。
基本上我將我的透視設置爲數組中的最後一個元素,並找到所有小於透視並增加左邊以成爲牆。所有更大的元素都交換到正確的位置。
這裏是我的解決方案
public static void QuickSort_Recursive(int[] array, int left, int right)
{
// only proceed if left is less than right
if(left < right)
{
// get index for left and right barrier
int pivotIndex = Partition(array, left, right);
// sort left
QuickSort_Recursive(array, left, pivotIndex - 1);
// sort right
QuickSort_Recursive(array, pivotIndex, right);
}
}
public static int Partition(int[] array, int left, int right)
{
// get pivot as last element
int pivot = array[right];
// continue until left passes right
while (left <= right)
{
// continue with left side until you find an element greater than pivot
while(array[left] < pivot)
{
left++;
}
// Continue with right until you find an element less than the pivot
while(array[right] > pivot)
{
right--;
}
// Only swap if left is less than right
if(left <= right)
{
// swap left and right
Swap(array, left, right);
// Increment left and decrement right
left++;
right--;
}
}
return left;
}
誰能幫助我瞭解爲什麼它設置爲最元素導致堆棧溢出異常的權利?
編輯:下面是不與樞軸是工作實現最右邊的,但他們關鍵就在這一個是1)它不包括交換,直到最後2樞軸)只移動左指針,以便跟蹤低位和高位之間的障礙3)不會移動兩個指針
// Make starting pivot the last one for now
int pivot = array[right];
int leftWall = left;
// Go through array until index before pivot is reached
for (int i = left; i < right; i++)
{
// If item at array[i] is less than or equal to pivot then switch with leftwall
if(array[i] <= pivot)
{
// Swap positions with leftWall
Swap_Memory(array, i, leftWall);
// Increment leftwall position
leftWall += 1;
}
}
// Swap pivot with whatever value is the top lowest number (pivot is 'right' in this case)
Swap_Memory(array, leftWall, right);
// return leftwall as pivot
// Leftwall is barrier between values lower than pivot and those higher
return leftWall;
- >> QuickSort_Recursive(array,pivotIndex + 1,right); –
nope,這並沒有解決它。 – mortey
它可能沒有完成,但它是不正確的! –