я собирался через код в C для сортировки слияния, которая выглядит следующим образом:Все как несколько экземпляров функции
void merge(int a[], int low, int mid, int high);
void divide(int a[], int low, int high)
{
if(low<high) // The array has atleast 2 elements
{
int mid = (low+high)/2;
divide(a, low, mid); // Recursion chain to sort first half of the array
divide(a, mid+1, high); // Recursion chain to sort second half of the array
merge(a, low, mid, high);
}
}
void merge(int a[], int low, int mid, int high)
{
int i, j, k, m = mid-low+1, n = high-mid;
int first_half[m], second_half[n];
for(i=0; i<m; i++) // Extract first half (already sorted)
first_half[i] = a[low+i];
for(i=0; i<n; i++) // Extract second half (already sorted)
second_half[i] = a[mid+i+1];
i = j = 0;
k = low;
while(i<m || j<n) // Merge the two halves
{
if(i >= m)
{
a[k++] = second_half[j++];
continue;
}
if(j >= n)
{
a[k++] = first_half[i++];
continue;
}
if(first_half[i] < second_half[j])
a[k++] = first_half[i++];
else
a[k++] = second_half[j++];
}
}
main()
{
int i, n, a[10];
printf("How many elements in the array? ");
scanf("%d", &n);
printf("Enter array: ");
for(i=0; i<n; i++)
scanf("%d", &a[i]);
divide(a, 0, n-1);
printf("\nSorted array: ");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
} `enter code here`
Здесь функция деление является рекурсивным, то называющим себя снова, пока условие выполняется. Но я смущен тем, существует ли какое-либо понятие типа «экземпляров функций» или «копий функций», вследствие чего значение переменных внутри вызываемой функции не зависит от его значения во время другого вызова этой функции. Таким образом, когда в этом коде деление вызывается снова, будет передан массив «a» в качестве аргумента функции, который был передан при первоначальном вызове функции или будет измененной версией, полученной в предыдущем вызове ? Я полагаю, что это не должно быть той же самой причиной, которая, по-видимому, вызовет функцию внутри той же функции бессмысленно. Может ли кто-то проливать на него какой-то свет, могут ли такие вещи, как копии или экземпляры функции?
Определенно может быть несколько «экземпляров * *» * стека функций *, да. – alk
@alk; Благодарю . Не могли бы вы рассказать немного больше и что именно происходит в этой программе? –
Концепция описана здесь: https://en.wikipedia.org/wiki/Merge_sort – alk