Member 13277005 Ответов: 1

С как рекурсивно сканировать ссылки в рекурсивном мерг-сортировка динамического массива


Привет, я работаю над этой практической проблемой. В которой я тестирую свой код с помощью команды 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];
    }
}

1 Ответов

Рейтинг:
0

Patrice T

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик-Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Member 13277005

Я думаю, что до сих пор не совсем понимаю концепцию ссылок, как только узнаю, как она работает. Со мной все будет в порядке. Если вы можете помочь мне с логикой, как она разрушается и сливается обратно в такой последовательности.

Patrice T

То, что должно быть связующим звеном для вас.

Member 13277005

указатель.

Patrice T

Вы уверены, что размер указателя такой же, как и целое число ?

Member 13277005

Если указатель int указывает на одну и ту же переменную int, то размер должен быть одинаковым.

Patrice T

ссылка-это указатель на массив int, а не на массив указателей.

Member 13277005

Мой указатель ссылки заполняется входными значениями массива, а затем устанавливается в значение -1.
То, что я понимаю, образует ваше объяснение. Он должен указывать на входной массив, я думал, что мой метод делает то же самое.

Member 13277005

Как эти числа генерируются для ссылок.

Patrice T

Я вижу, что ссылка не является указателем, она содержит только исходное положение числа во входных данных.

Member 13277005

так что ссылку я сменил на указатель
int * link: * input=NULL;
link= & amp;input[i];
остальное то же самое, мой выход все тот же.

Patrice T

Дайте попробовать отладчику

Member 13277005

Я отлаживаю его в Xcode.