繁体   English   中英

2 c中的维数组排序

[英]2 Dimensional Array sorting in c

这是我(不完整)代码的一部分

int rows(int board[][9]){
    int badUnits = 0, i = 0, n = 9, j, z = 0;
    int (*temp)[9];

    //Sort each row of 2d array
    for (z; z < n; z++){
        for (i; i < n; i++){
            for (j = i; j < n; j++){
                if (board[z][i] > board[z][j]){
                    temp = board[z][i];
                    board[z][i] = board[z][j];
                    board[z][j] = temp;
                }
            }
        }
    }

    printf ("%d\n", temp[1][0]);
    printf ("%d\n", temp[1][1]);

    return badUnits;
}

该函数采用9 * 9数组。

执行打印语句时出现分段错误。 我认为我的排序代码是正确的,因为它与我用于一维数组的代码相似,并且我认为其他所有内容均已正确分配。

因此,罪魁祸首将是我的临时变量。 我经历了尝试为它赋值,尝试更改类型,并考虑到2d数组会衰减为指针,但实际上并不是指针。

我得出的结论是,这是一个动态分配问题。 有人可以帮忙解决这个问题吗? 我已经用尽了我的知识并陷入困境。

澄清一下:我决定打印temp变量,因为我认为它会提供一些信息。 主要问题是交换不起作用,当我最初尝试打印出board [] []时,我仍然留下未排序的数组。 我知道该董事会是我应该打印的。

感谢您的任何帮助!

您将一个int值分配给temp

 temp = board[z][i]; // Temp now is a what ever value was at 
                     // That location in the array e.g. 42

然后,将temp视为整数数组内存中的地址

 temp[1][1] // treat temp as a pointer and find the integer 
            // 10 integers further along then temp.

同样,在某些情况下,临时温度不会被初始化(从未分配给),这取决于您现在临时温度所存储的最后一个值(让我们将其称为随机数),从而导致意外行为。

您是要输出板中的值吗?

printf ("%d\n", board[1][0]);
printf ("%d\n", board[1][1]);

需要注意的一件事是,如果排序算法正确,那么只有在发生交换的情况temp才将变量temp赋给该变量,而这仍然是对应于分类板的输入可能发生的情况。

但更重要的是,变量temp在交换期间用作int 后来,该整数值在表达式temp[1][0]temp[1][1]解释为指针,这在所有情况下都不是有效地址。 您可能需要将temp更改为:

int temp;

并弄清楚您要打印什么。 如果它是两个交换值之一(对于循环中的最后一个交换对),则将其打印为:

printf("%d", temp);

否则,您将不得不根据您真正想做的事情添加逻辑。

请注意,此算法的单次传递不会执行完整的排序,但是我想这就是您说所提供的代码不完整的原因之一。

像这样吗

#include <stdio.h>
#include <stdlib.h>


void printArray(int** arr, int w, int h) {
  for (int i = 0; i < w; ++i) {
    for (int j = 0; j < h; ++j) {
      printf("%d ", arr[i][j]);
    }

    printf("\n");
  }
}

void sortArray(int** arr, int w, int h) {
  for (int row = 0; row < h; ++row) {
    for (int col = 0; col < w; ++col) {

      for (int i = 0; i < w; ++i) {
        if (arr[row][i] > arr[row][col]) {
          int tmp = arr[row][col];

          arr[row][col] = arr[row][i];
          arr[row][i] = tmp;
        }
      }
    }
  }
}

int main() {
  int w = 9, h = 9;
  int** arr = (int**)malloc(sizeof(int*) * w);
  for (int i = 0; i < w; ++i) {
    arr[i] = (int*)malloc(sizeof(int) * h);

    for (int j = 0; j < h; ++j) {
      arr[i][j] = rand() % 10;
    }
  }

  printf("Unsorted:\n");
  printArray(arr, w, h);

  sortArray(arr, w, h);

  printf("Sorted:\n");
  printArray(arr, w, h);

  for (int j = 0; j < h; ++j) {
    free(arr[j]);
  }
  free(arr);

  return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM