我做了一堆。我很好奇,如果有什麼東西subtley錯了我的刪除功能:從堆中刪除元素
int Heap::remove() {
if (n == 0)
exit(1);
int temp = arr[0];
arr[0] = arr[--n];
heapDown(0);
arr[n] = 0;
return temp;
}
void Heap::heapDown(int i)
{
int l = left(i);
int r = right(i);
// comparing parent to left/right child
// each has an inner if to handle if the first swap causes a second swap
// ie 1 -> 3 -> 5
// 3 5 1 5 1 3
if (l < n && arr[i] < arr[l])
{
swap(arr[i], arr[l]);
heapDown(l);
if (r < n && arr[i] < arr[r])
{
swap(arr[i], arr[r]);
heapDown(r);
}
}
else if (r < n && arr[i] < arr[r])
{
swap(arr[i], arr[r]);
heapDown(r);
if (l < n && arr[i] < arr[l])
{
swap(arr[i], arr[l]);
heapDown(l);
}
}
}
這裏是我的輸出
i1i2i3i4i5i6i7
p
Active heap: 7 4 6 1 3 2 5
r
Removed 7
r
Removed 6
p
Active heap: 5 3 4 1 2
這裏是我的老師的輸出樣本:
p
Active heap : 7 4 6 1 3 2 5
r
Removed 7
r
Removed 6
p
Active heap : 5 4 2 1 3
s
Heapsorted : 1 2 3 4 5
雖然我們的輸出是完全不同的,我似乎堅持一切都離開導向的最大原則,並且對於所有節點parent> child(在任何情況下我都嘗試過)。我嘗試從頭開始這樣做,所以也許我只是在做一些非常奇怪和錯誤的事情(如果它是> O(lg n),我會認爲它是「錯誤的」,因爲刪除旨在用於堆)。我的刪除有什麼特別的「錯誤」嗎?謝謝,
+1。你提供了代碼,你明確的目標,你看到的事情正在發生,你認爲應該發生什麼,以及你與這兩者脫節。示例代碼很簡單,雖然它不是一個完整的,可編譯的代碼庫,但您認爲問題的核心可能是完整且可理解的。謝謝你的一個好問題。 – WhozCraig