С как рекурсивно сканировать ссылки в рекурсивном мерг-сортировка динамического массива
Привет, я работаю над этой практической проблемой. В которой я тестирую свой код с помощью команды bash с текстовым файлом. Файл содержит числа 1-е число - это сумма остальных чисел.
Например, 1-е число как 4 означает, что в строке Всего 4 числа.
Пример длина массива 8
3
5
6
7
0
4
1
2
Затем я должен использовать сортировку слиянием и после этого
выход таков
Первый элемент имеет индекс 4
0 3 5
1 5 2
2 6 3
3 7 -1
4 0 6
5 4 1
6 1 7
7 2 0
Он отлично работает для столбца индексов, входного столбца, но не для ссылок. Я сделал свой поиск по ссылкам и обнаружил, что они могут быть извлечены из функции сортировки. Теперь мой вопрос заключается в том, что функции mergesort, которые я использую, подходят для этой цели. Чего не хватает?
Что я уже пробовал:
#include <stdio.h> #include <stdlib.h> #define MAX 50 //Prototypes int binary(int a[],int n,int m,int l,int u); void partition(int **arr,int low,int high); void mergeSort(int arr[],int low,int mid,int high); int main() { //Variable initialization int n, j, temp, i=0, low = 0, indx = 0; int *index, *input, *link, *sorted; scanf("%d ",&n); //Memory allocation input = (int*) malloc((n)* sizeof(int)); index = (int*) malloc((n)* sizeof(int)); link = (int*) malloc((n)* sizeof(int)); sorted = (int*) malloc((n)* sizeof(int)); //Error handeling if(input == NULL) { printf("Error! memory not allocated."); exit(0); } //Input for(i= 0; i < n; i++) { scanf("%d",&input[i]); index[i]=i; sorted[i]=input[i]; link[i]=-1; } partition(&sorted,0,n-1); // Finding minimum value low=sorted[0]; for(i=0;i<n;i++){ if(input[i]==low) { indx=i; } } //Binary search for(i=0;i<n;i++){ temp= input[i]; for(j=0;j<n;j++){ if(sorted[j]==temp){ link[i]=j+1; printf("print link j+i %d\n", link[j]); if(link[i]==input[i]){ } } } } // Printing output printf("First element is at the subscript %d \n", indx); for(i=0;i<n;i++){ printf(" %d %d %d \n",index[i],input[i],link[i]); } /* for(i=0;i<n;i++) { printf("%d ",sorted[i]); }*/ //Memory deallocation free(index); free(input); free(link); return 0; } void partition(int **arr,int low,int high){ int mid; if(low<high){ mid=(low+high)/2; partition(arr,low,mid); partition(arr,mid+1,high); mergeSort(*arr,low,mid,high); } } void mergeSort(int arr[],int low,int mid,int high){ int i,m,k,l,temp[MAX]; l=low; i=low; m=mid+1; while((l<=mid)&&(m<=high)){ if(arr[l]<=arr[m]){ temp[i]=arr[l]; l++; } else{ temp[i]=arr[m]; m++; } i++; } if(l>mid){ for(k=m;k<=high;k++){ temp[i]=arr[k]; i++; } } else{ for(k=l;k<=mid;k++){ temp[i]=arr[k]; i++; } } for(k=low;k<=high;k++){ arr[k]=temp[k]; } }