【问题标题】:Bubble sort 2D array in CC中的冒泡排序二维数组
【发布时间】:2020-09-13 06:50:57
【问题描述】:

我需要一个函数来对这个随机生成的二维数组进行冒泡排序。 同样使用 rand() 方法,我希望它生成 (1, 1000000) 之间的数字,但它没有给出所需的范围,有什么建议可以找到解决方案吗?

int **matrix()
{

    int **matrix;
    int row, column;
    long s, k;
    int i,j,f,swap;


    srand(time(NULL));
    printf("Number of rows: ");
    scanf("%d", &row);

    printf("Number of column: ");
    scanf("%d", &column);


    matrix = (int **) calloc(row, sizeof(int));


    for(i = 0; i < row; i++)
        matrix[i] = (int *) calloc(column, sizeof(int));


    for(s = 0; s < row; s++)
    {
        for(k = 0; k < column; k++)
        {

            matrix[s][k]=rand()%10000000;
        }
    }

    for(s = 0; s < row; s++)
    {
        for(k = 0; k < column; k++)
            printf("%4d \t\t", matrix[s][k]);

        printf("\n");
    }


    for(i = 0; i < row; i++)
        free((void *) matrix[i]);


    free((void *) matrix);

    return **matrix;

}

【问题讨论】:

  • matrix = (int **) calloc(row, sizeof(int)); --> matrix = calloc(row, sizeof(int *)); OT:我将使用column 而不是colon
  • 尝试打印RAND_MAX。它可能小于 10000000。
  • 这里使用的内存分配方法有点缺陷,(见答案)并且不会创建连续的内存,这可能会使冒泡排序的完成方式变得复杂。您是否考虑过使用VLA?这将产生一个连续的内存块。例如:int rows = 1000; int cols = 1000; int array[rows][cols] = {0}; 创建1000000 连续和连续的int 内存位置,然后可以按通常的方式对其进行冒泡排序:在嵌套的i&lt;rowsj&lt;cols for 循环中:递增*(array + (i+j))。跨度>
  • 这能回答你的问题吗? BubbleSorting C language

标签: c arrays random bubble-sort


【解决方案1】:

使用冒泡排序对二维数组进行排序与​​对一维数组进行排序略有不同。 This example 可能会帮助您解决这部分问题。

其他问题

基于此部分:

for(i = 0; i < row; i++)
     matrix[i] = (int *) calloc(column, sizeof(int));

上一节中的那一行:

 matrix = (int **) calloc(row, sizeof(int));
                                        ^

应该为int *分配内存

 matrix = calloc(row, sizeof(int *));
                                 ^

(注意 calloc() 的演员表也已被删除。在 C 中 casting the return of [c][m][re]alloc is not recommended。)

还有 rand() 方法我希望它生成 (1, 1000000) 之间的数字,但它没有给出所需的范围,有什么建议可以找到解决方案

(感谢this answer

rand() 扩展为提供 1000000 个唯一值的随机分布:

unsigned long rand_ex(void);

int main(void){

    srand(clock());
    for(int  i=0;i<100;i++)
    {
        printf("%10d:  %10lu\n", i, rand_ex());
    }
    return 0;
}

unsigned long rand_ex(void)
{     
    unsigned long x;
    x = rand();
    x <<= 15;
    x ^= rand();
    x %= 1000001;

    return x;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2021-10-31
    • 2015-01-31
    • 2010-12-23
    相关资源
    最近更新 更多