【问题标题】:Sorting elements in a row in a 2 dimensional array using pointers使用指针对二维数组中的一行中的元素进行排序
【发布时间】:2017-12-29 06:51:55
【问题描述】:

我正在尝试对一行二维数组进行排序。但我无法实现。

例如:

    7 6 5
    5 7 6
    8 2 9
    2 3 4

变成这样:

    5 6 7
    5 6 7
    2 8 9
    2 3 4

下面是我的代码:

void sort(int *a,int num){
    int i,j,temp;
    for(i=0;i<num-1;i++){
        for (j=0;j<num-i-1;j++){
            if (*((a+i*3)+j)>*((a+i*3)+j+1)){
                temp=*((a+i*3)+j);
                *((a+i*3)+j)=*((a+i*3)+j+1);
                *((a+i*3)+j+1)=temp;
            }
        }
    }

    for(i=0;i<num;i++){
        for(j=0;j<3;j++)
            printf("%d ",*((a+i*3)+j));
        printf("\n");
        }
}

以上代码的输出:

    6 5 5 
    7 6 7 
    2 8 9 
    2 3 4

谁能说出代码中有什么问题? 提前致谢。 :D

编辑: 那么上面的代码应该是这样的吗?

    void sort(int *a,int num){
    int i,j,temp;
    for(i=0;i<num-1;i++){
        for (j=0;j<num-i-1;j++){
            if (*(*(a+i)+j)>*(*(a+i)+j+1)){
               temp=*(*(a+i)+j);
               *(*(a+i)+j)=*(*(a+i)+j+1);
               *(*(a+m)+j+1)=temp;
            }
        }
    }
}

【问题讨论】:

  • 没有二维数组。只是指向int 的指针。使用 2D 数组(分别是指向 1D 数组的指针)和 index-operator 会使这个混乱的部分变得可读。

标签: c pointers multidimensional-array bubble-sort


【解决方案1】:

主要有两个问题:

1) 循环未运行 n 次,因此 for 循环中的条件应更改为 i &lt; num 而不是 i &lt; num - 1 跳过最后一行

2) 从您的代码看来,您想使用冒泡排序技术。排序为 O(n^2),这就是为什么需要交换 if 语句为每个元素运行 (n - 1) 次,因此您应该在 j-for 循环中再包含一个 for 循环。

【讨论】:

  • 哦!非常感谢...没想到另一个循环。再次感谢。 :D
【解决方案2】:

代码太复杂,犯了很多小错误。

你应该以某种方式分开每一行的排序,像这样:

for (row = 0; row < num; row++) {
    sort_row(a + row * 3);
}

函数sort_row 只对一行进行排序,因此它会更容易编写和测试(顺便说一句,我将不起眼的名称i 替换为row)。

函数sort_row 应该进行正常的冒泡排序。您甚至可以改用标准库 qsort(出于测试目的)。

请注意,标准冒泡排序算法是通过两个嵌套循环实现的。如果您想在没有单独的sort_row 函数调用的情况下实现您的代码,您将需要三个 嵌套循环。

【讨论】:

  • Thx, anatolyg 我会记住下次使用库函数... :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 2021-12-06
  • 2017-05-25
  • 2017-04-18
  • 2016-02-17
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多