如何按用户对给定列和行按行和列顺序排序2d数组

时间:2016-10-23 09:20:46

标签: c sorting

伙计们,这是我第一次在stackoverflow中 我想按行和列方式排序随机数组 在此之后,我必须搜索一个给定的密钥,但我已经存入  第一部分。 问题是用户应该在(2-5000)之间选择数组的维度,并且数组中的元素在(4-25 mil)之间,并且每个元素可以从0到int MAX,并且列和行的数量彼此相等 我找到了很好的代码,但我不明白如何更改它以满足我的程序的限制我试图#define我的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 && 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");
    }
}

任何帮助都会很棒

2 个答案:

答案 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 sortquick 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");
    }
}