#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, но это упростило мою жизнь