插入和堆栈到使用数组构建的堆

时间:2017-10-10 15:18:36

标签: c++ arrays binary-heap

我正在尝试使用数组创建二进制堆。我已经成功地使用buildHeapheapify创建了堆。我的问题是当我尝试将insert一个新元素放入数组时,以及当我尝试使用heapSort对其进行排序时。

以下是heapify函数的内容:

void heap::Heapify(int arr[], int i){
    int largest = i;
    int L = LeftChild(i);
    int R = RightChild(i);
    if (L <= heapSize && arr[L] > arr[i])
        largest = L;
    else{
        largest = i;
    }

    if (R <= heapSize && arr[R] > arr[largest]){
        largest = R;
    }
    if(largest != i){
        int temp = arr[i];
        arr[i] = arr[largest];
        arr[largest] = temp;
        Heapify(arr, largest);
    }
}

这是我的buildHeap功能:

void heap::BuildHeap(int arr[]){
    for(int i = (heapSize/2)-1; i >= 0; i--){
        Heapify(arr, i);
    }
}

这两个功能起作用,而以下不起作用,对于插入,它不会将其插入正确的位置。

以下是insert功能:

void heap::Insert(int arr[], int key){
    heapSize++;
    int i = heapSize - 1;

    while(i > 0 && arr[Parent(i)] <= key){
        arr[i] = arr[Parent(i)];
        i = Parent(i);
    }

    arr[i] = key;
}

使用heapSort函数,它会对大部分内容进行排序,但会像这样打印出来(第一行是排序之前的堆):

32 24 5 19 23 4 3 11 2 12 
5 2 4 3 23 19 32 11 24 12 

这是我的heapSort函数:

void heap::HeapSort(int arr[]){
    for(int i = heapSize - 1; i >= 0; i--){
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;

        heapSize = heapSize - 1;
        Heapify(arr, 0);
    }
}

非常感谢任何有关如何解决这两个功能无法正常工作的帮助。

1 个答案:

答案 0 :(得分:0)

我认为问题是这些行中的“一个错误”

if (L <= heapSize && arr[L] > arr[i])

if (R <= heapSize && arr[R] > arr[largest]){

它们都应该是<而不是<=,因为最后一个元素位于heapsSize-1

其他细节

void heap::Heapify(int arr[], int i){
    int largest = i; // setting largest to i first time
    int L = LeftChild(i);
    int R = RightChild(i);
    if (L <= heapSize && arr[L] > arr[i]) // compare with arr[i] is not wrong but doesn't express the intent.
        largest = L;
    else{
        largest = i; // setting largest to i second time
    }

    if (R <= heapSize && arr[R] > arr[largest]){
        largest = R;
    }
    if(largest != i){
        int temp = arr[i];      // these 3 lines are the std::swap
        arr[i] = arr[largest];  // or you could roll your own function that does the same.
        arr[largest] = temp;    // better expressing the intent.
        Heapify(arr, largest);
    }
}

改写为

void heap::Heapify(int arr[], int i){
    int largest = i;
    int L = LeftChild(i);
    int R = RightChild(i);

    if (L < heapSize && arr[L] > arr[largest]) {
        largest = L;
     }

    if (R < heapSize && arr[R] > arr[largest]) {
        largest = R;
    }

    if(largest != i){
        swap(arr[i], arr[largest]);
        Heapify(arr, largest);
    }
}