伙计们,这是我第一次在stackoverflow中 我想按行和列方式排序随机数组 在此之后,我必须搜索一个给定的密钥,但我已经存入 第一部分。 问题是用户应该在(2-5000)之间选择数组的维度,并且数组中的元素在(4-25 mil)之间,并且每个元素可以从0到int MAX,并且列和行的数量彼此相等 我找到了很好的代码,但我不明白如何更改它以满足我的程序的限制我试图#define我的2d数组这样
但这是错误的 这是我想写的代码
#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 && 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 && 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",&r,&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");
}
}
任何帮助都会很棒
答案 0 :(得分:0)
您已使用#define定义了使用R和C声明的数组,但是您从用户那里读取了新值r和c并进行了处理。
您应该使用您将使用的值来定义数组维度。
此外,您已将整数传递给sort_column,它被视为按值调用,但您应该传递数组指针以便能够编辑数组,这是通过引用调用。
希望有所帮助。
答案 1 :(得分:0)
你通常不能。 50000x50000 2D阵列具有50000x50000x(int
大小)位。
这是(int
大小等于4个字节)10 GB内存,超过系统通常允许的范围。
这是改变操作系统限制的方法,但在这种情况下更容易使数组成为全局数据。
这段代码有很多笨拙的行,看起来不必要或者是错误的,所以我缩短了一下并稍微改了一下,让它按照预期的方式工作。
请记住,您获得的这些函数正在运行insertion sort,这是一种非常低效的排序算法(O(n ^ 2))。该程序将花费大量时间来运行大型实例。您可能希望寻找更好的算法,例如merge sort和quick sort。
修改算法:
#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 && 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 && 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",&r,&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");
}
}