我正在尝试使用数组创建二进制堆。我已经成功地使用buildHeap
和heapify
创建了堆。我的问题是当我尝试将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);
}
}
非常感谢任何有关如何解决这两个功能无法正常工作的帮助。
答案 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);
}
}