2017-07-23 91 views
1

我想排序2维数组的行。但我无法实现它。使用指针对2维数组中的行进行排序

对于例如:

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

是这样:

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

下面是我的代码:

6 5 5 
    7 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"); 
     } 
} 

上面的代码的输出

任何人都可以告诉代码中有什么问题吗? 在此先感谢。 :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; 
      } 
     } 
    } 
} 
+0

没有二维数组。只是一个指向'int'的指针。使用二维数组(指向一维数组的指针)和索引操作符将使这个混乱中途可读。 – Olaf

回答

2

有两个主要问题:

1)的环未运行n次,因此,在for循环的条件应改为i < num代替i < num - 1其中跳过最后一行

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

+0

哦!非常感谢...没有想到另一个循环。 Thx再次。 :d – nimish642

1

该代码太复杂,所以你做了很多小错误。

你应该分开莫名其妙的每一行的排序是这样的:

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

功能sort_row种类只有一行,所以这将是更容易编写和测试(BTW我更换了不伦不类的名字i通过row)。

功能sort_row应该做正常的气泡排序。您甚至可以使用标准库qsort(用于测试目的)。

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

+0

Thx,anatolyg下次我会记住使用库函数...:D – nimish642