繁体   English   中英

自然排序与qsort不起作用

[英]Natural sort with qsort not working

我正在尝试对一个顶点数组进行排序,我需要制作的程序是从不同的图形为顶点着色,为了更有效地执行此操作,我们使用不同的顺序来运行贪婪,我的问题是当我尝试按升序排列它们时顺序,我使用的是qsort(),由于某种原因,它在某些图形上不起作用,我不明白为什么,我将在顶点的结构,比较函数以及我正在使用的函数下面检查数组是否已排序。 顶点按名称进行比较(西班牙语中的名词)

类型定义:

typedef uint32_t u32; /* Definición de tipo u32 */
typedef struct _Vertice_t *PVertice;
typedef struct _Grafo_t *Grafo;

顶点:

/* Definición de Estructura Vertice */
struct _Vertice_t {
    u32 nombre; /* Nombre real del vértice */
    u32 grado; /* Grado del vértice */
    u32 color; /* Color del vértice  */
    u32 index; /* Indice */
        u32 mem_vecinos;
        u32 tag;
        bool visitado;/*variable para saber el numero de componentes conexas*/
        u32 x_aleatorio;/* u32 para uso exclusivo en funcion orden aleatorio */
        u32 aleatorio; /* u32 para uso exclusivo en funcion orden aleatorio */
    u32 cant_de_colores; //uso exclusivo para orden bloque  == 1
    PVertice *vecinos; /* Vecinos del vértice */
};

图形:

/* Definición de Estructura Grafo */
struct _Grafo_t {
    u32 nro_vertices; /* Cantidad de vértices del Grafo */
    u32 nro_lados; /* Cantidad de lados del Grafo */
    u32 nro_colores; /* Cantidad de colores usados para colorear el Grafo */
    PVertice vertices; /* Arreglo de Vértices del Grafo */
        bool *facil_busqueda;
    PVertice *orden; /* Arreglo indicador del orden de los vértices del Grafo*/
};

比较功能:

int cmpfunc (const void * a, const void * b) {
    PVertice vertice_1 = *(PVertice*)a;
    PVertice vertice_2 = *(PVertice*)b;
  int resultado = ( vertice_1->nombre )-(vertice_2->nombre);
    return resultado;
}

排序:

void OrdenNatural(Grafo G) {
    qsort(G->orden, G->nro_vertices, sizeof(PVertice), cmpfunc);
}

最后,我如何对其进行排序:

bool arrayIsSorted(PVertice *a, u32 n) {
  if ((n == 1) || (n == 0))
    return true;

  if (a[n-1]->nombre < a[n-2]->nombre) {
    printf("%u %u\n", a[n-1]->nombre, a[n-2]->nombre);
    return false;
  }

  return arrayIsSorted(a, n-1);
}

在终端上运行时,我从1个特定图获得的结果:

2 4294965727

0

我不确定是为什么int与您的编译器的int32_t大小相同,为什么您的原始文件不起作用。 如果您的vertice1->nombre小于vertice2->nombre那么vertice1->nombre-vertice2->nombre将是一个大的无符号值,超出32位int的范围。 尽管实际结果是实现定义的,但大多数编译器只会将超出范围的值映射为负数。

当减去unsigned int值时,“负”差最终将是一个较大的unsigned int值,该值超出int的范围,因此结果将由实现定义。 对于一个qsortbsearch返回值的比较函数,只有符号(正,负或零)时,这样一个实现定义结果可以通过总是返回避免-1为“负”的区别, 1为“正”差异,或0表示无差异。 有(至少)三种方式可以实现这一目标:

  1. 使用if语句:

     if (a > b) result = 1; else if (a < b) result = -1; else result = 0; 
  2. 使用条件运算符:

     result = a > b ? 1 : (a < b ? -1 : 0); 
  3. 使用比较差异:

     result = (a > b) - (a < b); 

    (这可能是3个选项中“最聪明的”,尽管可能不是最清晰的)。

如果qsortbsearch想要按相反顺序的值,则只需颠倒变量的顺序或颠倒比较运算符。

暂无
暂无

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

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