Компилятор читает файл сверху вниз. Если он видит swap
по swap(arr, i, min_i);
внутри BiDirectionalSelectionSort
, он не знает, что это такое.
Вам необходимо:
- Использовать предварительное объявление для функцию
swap
и поместите ее перед определением BiDirectionalSelectionSort
#include <stdio.h>
#include <string.h>
void swap (int** arr, int i, int j); // <------------ HERE
static void BiDirectionalSelectionSort (int arr[], int n)
{
for (int i = 0, j = n - 1; i < j; i++, j--)
{
int min = arr[i], max = arr[i];
int min_i = i, max_i = i;
for (int k = i; k <= j; k++)
{
if (arr[k] > max)
{
max = arr[k];
max_i = k;
}
else if (arr[k] < min)
{
min = arr[k];
min_i = k;
}
}
swap(&arr, i, min_i);
if (arr[min_i] == max)
swap(&arr, j, min_i);
else
swap(&arr, j, max_i);
}
}
void swap (int **arr, int i, int j)
{
int temp = (*arr)[i];
(*arr)[i] = (*arr)[j];
(*arr)[j] = temp;
return;
}
int main (void)
{
int arr[] = { 20, 15, 8, 10, 5, 7, 6, 2, 9, 1 };
size_t n = sizeof (arr) / sizeof (*arr);
BiDirectionalSelectionSort(arr, n);
printf("Array:\n");
for (size_t i = 0; i < n; i++)
{
printf("arr[%d] = %d\n", i, arr[i]);
}
}
или
Поместите определение
swap
перед определением функции
BiDirectionalSelectionSort
.
#include <stdio.h>
#include <string.h>
void swap (int **arr, int i, int j)
{
int temp = (*arr)[i];
(*arr)[i] = (*arr)[j];
(*arr)[j] = temp;
return;
}
static void BiDirectionalSelectionSort(int arr[], int n)
{
for (int i = 0, j = n - 1; i < j; i++, j--)
{
int min = arr[i], max = arr[i];
int min_i = i, max_i = i;
for (int k = i; k <= j; k++)
{
if (arr[k] > max)
{
max = arr[k];
max_i = k;
}
else if (arr[k] < min)
{
min = arr[k];
min_i = k;
}
}
swap(&arr, i, min_i);
if (arr[min_i] == max)
swap(&arr, j, min_i);
else
swap(&arr, j, max_i);
}
}
int main (void)
{
int arr[] = { 20, 15, 8, 10, 5, 7, 6, 2, 9, 1 };
size_t n = sizeof (arr) / sizeof (*arr);
BiDirectionalSelectionSort(arr, n);
printf("Array:\n");
for (size_t i = 0; i < n; i++)
{
printf("arr[%d] = %d\n", i, arr[i]);
}
}
Примечание сбоку:
static void Main()
- Эта голова для main()
устарел четырьмя разными способами. Слева направо:
main()
нельзя квалифицировать с помощью static
. По крайней мере, не "основной" main()
. Вы можете иметь функцию main()
в другом исходном файле и объявить ее static
, но это другой случай. - Возвращаемое значение
main()
должно быть целочисленного типа, обычно int
, не void
. - Компоновщик чувствителен к регистру.
Main
- это другой идентификатор, чем main
. - Чтобы полностью соответствовать стандарту, список параметров
main
не должен быть пустым, используйте вместо него (void)
.