Как отсортировать 2d массив по столбцам и строкам для заданных столбцов и строк пользователями

#c #sorting

#c #сортировка

Вопрос:

ребята, это мой первый раз в stackoverflow, я хочу отсортировать массив случайных чисел по строкам и столбцам, после этого мне нужно выполнить поиск по заданному ключу, но я запасся первой частью. проблема в том, что пользователь должен выбрать размер массива между (2-5000), а элементы в массиве — между (4-25 миллионов), и каждый элемент может быть от 0 до int MAX, а количество столбцов и строк равно друг другу Я нашел хороший код, но я не понял, как его изменить, чтобы удовлетворить предел моей программы Я попытался #определить мой 2d массив следующим образом

определите R 5000

определите C 5000

но это неправильно, это код, который я пытаюсь написать

 #include<stdio.h>
#define R 500
#define C 500

void sort_rows(int *arr,int n)
{
    int i;
    for(i=1;i<n;i  )
    {
        int key=arr[i];
        int j=i-1;
        while(j>=0 amp;amp; key<arr[j])
        {
            arr[j 1]=arr[j];
            j--;
        }
        arr[j 1]=key;
    }
}
void sort_column(int arr[500][500],int c)
{
    int key,k;
    int i,j;
    for(i=0;i<c;i  )
    {
        for(j=1;j<c;j  )
        {
            key=arr[j][i];
            k=j-1;
            while(k>=0 amp;amp; arr[k][i]>key)
            {
                arr[k 1][i]=arr[k][i];
                k--;
            }
            arr[k 1][i]=key;
        }
    }
}
int main()
{
    int arr[R][C];
    int r,c;
    int i,j,size_row,size_column;
    printf("Enter Number of rows and columns(2-5000)");
    scanf("%d%d",amp;r,amp;c);
    for(i=0;i<r;i  )
    {
        for(j=0;j<c;j  )
            arr[i][j]=rand()%(r*c) 1;
    }
    printf("Original array:n");
    for(i=0;i<r;i  )
    {
        for(j=0;j<c;j  )
        {
            printf("%d ",arr[i][j]);

        }
        printf("n");
    }
    size_row=((sizeof(arr)/sizeof(arr[0][0])/(sizeof(arr[0])/sizeof(arr[0][0]))));
    printf("%d",size_row);
        for(i=0;i<size_row;i  )
    {
        sort_rows(arr[i],sizeof(arr[i])/sizeof(arr[i][0]));
    }
        size_column=sizeof(arr)/sizeof(arr[0]);
    for(i=0;i<size_column;i  )
    {
        sort_column(arr,size_column);
    }
    printf("Sorted Array:n");
    for(i=0;i<r;i  )
    {
        for(j=0;j<c;j  )
        {
            printf("%d ",arr[i][j]);

        }
        printf("n");
    }
}
  

любая помощь была бы отличной

Комментарии:

1. Если это не назначение, вы можете захотеть использовать qsort() который уже включен в stdlib.h.

2. на самом деле, это задание, спасибо за ваш комментарий, но мне нужна именно помощь в этом

Ответ №1:

Вы объявили свой массив с помощью R и C, которые вы определили с помощью #define, но вы считываете новые значения, r и c, от пользователя и работаете над этим.

Вы должны определить размеры вашего массива со значениями, которые вы будете использовать.

Кроме того, вы передали целое число в sort_column, которое рассматривается как вызов по значению, но вы должны передать указатель на массив, чтобы иметь возможность редактировать свой массив, и это вызов по ссылке.

Надеюсь, это поможет.

Комментарии:

1. Я попытался выполнить сканирование («% d%d, amp; R, amp; C), но это не сработало, и я попытался передать в указатель мой столбец sort_column (arr, size_column) пустой столбец sort_column (int * arr, int c)

2. не могли бы вы, пожалуйста, изменить какую-то часть этого кода, которая, по вашему мнению, неверна, и вставить ее сюда, что было бы действительно полезно

3. Вы не можете редактировать значение #define. Если вы хотите получить размеры массива от пользователя с помощью scanf, то вам не нужно #define C и R. Я имею в виду, не используйте оба. Для вызова по ссылке для двумерного массива вам нужно выполнить: sort_column(int **arr, int c).

4. Хорошо, спасибо, теперь все в порядке, но все равно вся программа не работает

Ответ №2:

  • Обычно вы не можете. 2D массив размером 50000×50000 имеет биты размером 50000x50000x ( int размер).

    Это (с int размером, равным 4 байтам) 10 ГБ памяти, больше, чем обычно позволяет ваша система.

    Есть способы изменить ограничения ОС, но в этом случае проще сделать ваш массив глобальным.

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

  • Имейте в виду, что эти функции, которые у вас есть, используют сортировку по вставке, довольно неэффективный алгоритм сортировки (O (n ^ 2)). Программе потребуется МНОГО времени для запуска с большими экземплярами. Возможно, вам захочется поискать лучшие алгоритмы, такие как сортировка слиянием и быстрая сортировка.

Модифицированный алгоритм:

 #include <stdio.h>
#include <stdlib.h>
#define R 50000
#define C 50000

int arr[R][C];
void sort_rows(int *arr,int n)
{
    int i;
    for(i=1;i<n;i  )
    {
        int key=arr[i];
        int j=i-1;
        while(j>=0 amp;amp; key<arr[j])
        {
            arr[j 1]=arr[j];
            j--;
        }
        arr[j 1]=key;
    }
}
void sort_column(int arr[][C],int r,int c)
{
    int key,k;
    int i,j;
    for(i=0;i<r;i  )
    {
        for(j=1;j<c;j  )
        {
            key=arr[j][i];
            k=j-1;
            while(k>=0 amp;amp; arr[k][i]>key)
            {
                arr[k 1][i]=arr[k][i];
                k--;
            }
            arr[k 1][i]=key;
        }
    }
}
int main()
{
    int r,c;
    int i,j,size_row,size_column;
    printf("Enter Number of rows and columns(2-%d,2-%d)",R,C);
    scanf("%d%d",amp;r,amp;c);
    for(i=0;i<r;i  )
    {
        for(j=0;j<c;j  )
            arr[i][j]=rand()%(r*c) 1;
    }
    printf("Original array:n");
    for(i=0;i<r;i  )
    {
        for(j=0;j<c;j  )
        {
            printf("%d ",arr[i][j]);

        }
        printf("n");
    }
    for(i=0;i<r;i  )
    {
        sort_rows(arr[i],c);
    }
    sort_column(arr,r,c);
    printf("Sorted Array:n");
    for(i=0;i<r;i  )
    {
        for(j=0;j<c;j  )
        {
            printf("%d ",arr[i][j]);

        }
        printf("n");
    }
}
  

Комментарии:

1. вау, потрясающе, большое вам спасибо, на самом деле я все еще не в порядке с C, но это упростило мою жизнь