當我將數組值賦值爲rand()
或任何常數值時,我感到非常困惑,爲什麼此C++代碼段的行爲不同。快速排序爲常數提供stackoverflow但不是隨機數
const int MIN_SIZE = 10000;
const int MAX_SIZE = 100000;
int main()
{
for(j = MIN_SIZE; j <= MAX_SIZE; j += MIN_SIZE) {
int *arrPtr = new int[j];
for(int i = 0; i < j; i++)
arrPtr[i] = 1; //When I put rand() here, it works fine but in any constant it gives stack overflow
quickSort(arr, 0, j - 1);
delete []arrPtr;
}
}
上述基本的代碼創建與j
在每匝一個動態分配的陣列大小,這得到由MIN_SIZE
(10,000)遞增,並且分配一些特定整數每個索引。賦值後,它將與我將在下面提供的快速排序算法分類,然後在完成時釋放此數組。這整件事重複到MAX_SIZE
(100,000)。
這裏是我的快速排序代碼:
void quickSort(int *arr, int front, int rear)
{
if (front < rear)
{
int part = partition(arr, front, rear);
quickSort(arr, front, part - 1);
quickSort(arr, part + 1, rear);
}
}
int partition(int *arr, int front, int rear)
{
int element = arr[rear];
int i = front - 1;
for (int j = front; j<rear; ++j)
{
if (arr[j] <= element)
{
++i;
long temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
long temp = arr[i + 1];
arr[i + 1] = arr[rear];
arr[rear] = temp;
return i + 1;
}
我試圖實現其嚴格使用最後一個項目爲支點快速排序算法。在這種情況下,我面臨着一個奇怪的問題:當我使用rand()
函數將數組的每個值賦給一個隨機數時,一切正常,但是,當我輸入一個常數值時,數組的大小會上升到4039(當你操縱MAX_SIZE和MIN_SIZE時)則給出堆棧溢出錯誤。我真的很困惑,爲什麼地球上會引起問題,此外,爲什麼4039?
檢查分區的返回值。我想你有一個運行的方式遞歸,由於分區返回一個錯誤的值,導致快速排列整個數組一遍又一遍。 –
這功課嗎?如果是這樣的話,那麼在網絡和SO上的快速排序會有很多幫助。否則...使用'vector'和內置的'sort'算法。 10次中有9次會比你寫的速度快。 –
當數組中的所有元素都相同時,數組已經被排序,並且如果數組已經排序,那麼使用quicksort會導致最壞的情況。 [請參閱此解釋](https://en.wikipedia.org/wiki/Quicksort#Choice_of_pivot)。 –