Qsort不工作-把数组完全搞乱了

qsort not working - messing up array completely

本文关键字:乱了 数组 工作 -把 Qsort      更新时间:2023-10-16

那么,我有一个结构体,由3个整数组成。这个结构体代表我的"表"中的一行。表格基本上是行数组,称为"v"因为我的任务,我需要使用这种格式而不是2d数组之类的。现在,我需要根据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最后没有返回值。它会导致未定义的行为。

可以简化为:

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);
}