【问题标题】:qsort not working - messing up array completelyqsort 不工作 - 完全搞乱数组
【发布时间】:2015-10-09 15:34:43
【问题描述】:

所以,我有一个结构,由 3 个整数组成。这个结构代表我的“表”的一个“行”。表基本上是行数组,称为“v”由于我的任务,我需要使用这种格式而不是例如二维数组和这些东西。现在,我需要根据 x、y 和 z “按字典顺序对我的行进行排序”。问题在于 qsort 函数 - 它以某种方式弄乱了我的整个数组“v”,变得无用。我现在不知道是什么原因。 compare 函数根据 x 比较行,而不是根据 y 和 z (我认为是正常的字典排序)。函数打印只是打印表格。

#include <iostream>
#include <stdlib.h>
using namespace std;
struct row {
    int x, y, z;
}; 
int compar(const void* p1, const void* p2){
    if(((row*)p1)->x < ((row*)p2)->x){
        return -1;
    }   
    if(((row*)p1)->x = ((row*)p2)->x){
        if(((row*)p1)->y < ((row*)p2)->y){
            return -1;
        }    
        if(((row*)p1)->y = ((row*)p2)->y){
            if(((row*)p1)->z < ((row*)p2)->z){
                return -1;
            }
            if(((row*)p1)->z = ((row*)p2)->z){
                return 0;
            }
            if(((row*)p1)->z > ((row*)p2)->z){
                return 1;
            }
        }     
        if(((row*)p1)->y > ((row*)p2)->y){
            return 1;
        }
    }    
    if(((row*)p1)->x > ((row*)p2)->x){
        return 1;
    }
}

void printing(row v[], int p){
    cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" << endl;
    for (int i = 0; i < p; i++){
        cout << v[i].x << " " << v[i].y<< ' ' << v[i].z << endl;
    }
    cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" << endl;
}
int main(void){
    int numOfRows;
    cin >> numOfRows; //format of input needs this
    row  v[numOfRows];
    for (int i = 0; i < numOfRows; i++) {    
        cin >> v[i].x >> v[i].y  >> v[i].z;  
    }
    qsort(v,numOfRows,sizeof(row),compar);
    printing(v,numOfRows);
}

现在我正在发布带有输出的输入,您可以清楚地看到,有些行在排序过程中重复了,有些行完全丢失了。

3
1 2 3
1 4 5
1 2 4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1 2 3
1 2 4
1 2 4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

下一个输入输出是:

4
100 100 100
100 100 100
100 99 99
99 99 100
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
99 99 99
99 99 99
99 99 99
99 99 100
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

它显然应该是这样的,例如:

3
1 2 3
1 4 5
1 2 4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1 2 3
1 2 4
1 4 5
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

这将是我的 qsort 的正确输出。任何帮助将不胜感激,因为我完全不知道为什么会发生这种情况。我整个下午都在努力解决这个问题,但我没有想法。非常感谢

【问题讨论】:

  • 我会在你的 compar 函数的顶部创建新的变量,比如 row *row1 = (row *)p1;,这样你就不必经常转换了。
  • 你为什么首先使用qsort
  • 看来你的比较函数太复杂了,我不认为有这么多可能的不同条件。另外,请不要使用c 标记,因为c 中的解决方案会有所不同,而您显然使用的是c++。
  • 是的,这是真的,我的错,但是,我认为算法在我的实现中相当简单和正确,不应该影响消失的行,它只是一个正常的字典比较:如果 p1. x 等于 p2.x 试试 y,如果也等于,试试 z,如果不等于,则判断哪个“更小”
  • 第二个比较中只有一个 =。这将改变坐标而不是比较它们。

标签: c++ struct qsort


【解决方案1】:

您的很多比较都使用= 而不是==,这将导致值被复制到不应出现的位置。如果您在编译器上将警告级别设置得足够高,它应该会对此发出警告。

【讨论】:

    【解决方案2】:

    函数compar最后没有返回值。它会导致未定义的行为。

    您可以将其简化为:

    int compar(const void* p1, const void* p2)
    {
       row const* row1 = (row const*)p1;
       row const* row2 = (row const*)p2;
    
       if ( row1->x != row2->x )
       {
          return (row1->x - row2->x);
       }
    
       if ( row1->y != row2->y )
       {
          return (row1->y - row2->y);
       }
    
       return (row1->z - row2->z);
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 2012-01-11
      • 2018-10-16
      • 2013-02-28
      相关资源
      最近更新 更多