Код ниже кучи сортирует вектор целых чисел от наименьшего к наибольшему.
#include <iostream>
#include <vector>
using namespace std;
void shift_down(vector<int>& heap,int i, int max) {
int i_big, c1, c2;
while(i < max) {
i_big = i;
c1 = (2*i) + 1;
c2 = c1 + 1;
if( c1<max && heap[c1]>heap[i_big] )
i_big = c1;
if( c2<max && heap[c2]>heap[i_big] )
i_big = c2;
if(i_big == i) return;
swap(heap[i],heap[i_big]);
i = i_big;
}
}
void to_heap(vector<int>& arr) {
int i = (arr.size()/2) - 1;
while(i >= 0) {
shift_down(arr, i, arr.size());
--i;
}
}
void heap_sort(vector<int>& arr) {
to_heap(arr);
int end = arr.size() - 1;
while (end > 0) {
swap(arr[0], arr[end]);
shift_down(arr, 0, end);
--end;
}
}
int main() {
vector<int> data = {
12, 11, 15, 10, 9, 1, 2,
3, 13, 14, 4, 5, 6, 7, 8
};
heap_sort(data);
for(int i : data) cout << i << " ";
}
В настоящее время я пытаюсь передать указатель на функцию bool вспомогательной функции (shift_down), чтобы я мог выбрать способ сортировки кучи, но моя проблема в том, что я не знаю, какие параметры передать функциям, вызывающим эту функцию вспомогательная функция.
Это то, что я сейчас пытаюсь сделать с помощью функции shift_down
void shift_down(vector<int>& heap, int i, int max, bool(*sbb)(int n1, int n2)) {
int i_big, c1, c2;
while (i < max) {
i_big = i;
c1 = (2 * i) + 1;
c2 = c1 + 1;
if (c1<max && sbb(heap[i_big], heap[c1]))// calling function pointer
i_big = c1;
if (c2<max && sbb(heap[i_big], heap[c2])) // calling function pointer
i_big = c2;
if (i_big == i) return;
swap(heap[i], heap[i_big]);
i = i_big;
}
}
Например, я могу попытаться передать одну из двух функций ниже в main
bool sbb0(int n1, int n2) {
if (n1 < n2) {
return true;
}
else {
return false;
}
}
bool sbb1(int n1, int n2) {
if (n1 > n2) {
return true;
}
else {
return false;
}
}
Думаю, я бы так и сделал:
int main(){
vector<int> data = {
12, 11, 15, 10, 9, 1, 2,
3, 13, 14, 4, 5, 6, 7, 8
};
heap_sort(data, sbb0);
for (int i : data) cout << i << " ";
enter code here
}
Итак, моя проблема в том, что я пытаюсь передать параметр указателя на функцию сверху вниз, но не уверен, как именно это сделать в отношении параметров функций, вызывающих вспомогательные функции. Вся помощь и руководство приветствуются.