首页 > 解决方案 > Qsort从小到高排序

问题描述

有人知道如何编写 qsort 的比较函数吗?我希望 comparefunction1 从最高到最低对数组进行排序,并希望 comparefunction2 从最低到最高对另一个数组进行排序。我的代码:

   int cmpfunc(const void *a, const void *b) {                                                                                             
       if (*(double*) a < *(double*) b)
           return 1;
       else if (*(double*) a > *(double*) b)
           return -1;
       else
           return 0;
   }

   int cmpfunc2(const void *a, const void *b) {
       if (*(float*) a < *(float*) b)
           return -1;
       else if (*(float*) a > *(float*) b)
           return 1;
       else
           return 0;
   }

可悲的是,这两个比较函数都是从最高到最低排序的。我想要一个从最低到最高排序。qsort 看起来像这样:

#include "stdio.h"
int main(){
qsort(Acal, 4, sizeof(float), cmpfunc);
qsort(Value, 4, sizeof(float), cmpfunc2);
}

有人看到错误,或者知道如何编写 cmpfunctions 吗?我只想让 Value 数组从最低到最高排序。真正的代码很难理解(我是 c 新手) main.h :

typedef struct{
    float Value[5] ;
double Acal[5];
} value;

int cmpfunc();
int cmpfun2();

这是数组,只是不关心结构。我想用 cmpfunc1 排序的数组是双精度(双 Acal [5])

标签: ccompareqsort

解决方案


看来你混淆了floatdouble

这显示了如何完成这项工作。double它对一个数组和一个数组进行排序,float一次自上而下,一次自下而上。

这是不言自明的:

#include <stdio.h>
#include <stdlib.h>

// compare functions for top down sorting

int cmpfuncDoubleTopDown(const void* a, const void* b) {
  if (*(double*)a < *(double*)b)
    return 1;
  else if (*(double*)a > *(double*)b)
    return -1;
  else
    return 0;
}

int cmpfuncFloatTopDown(const void* a, const void* b) {
  if (*(float*)a < *(float*)b)
    return 1;
  else if (*(float*)a > *(float*)b)
    return -1;
  else
    return 0;
}


// compare functions for top bottom up sorting

int cmpfuncDoubleBottomUp(const void* a, const void* b) {
  if (*(double*)a > *(double*)b)
    return 1;
  else if (*(double*)a < *(double*)b)
    return -1;
  else
    return 0;
}

int cmpfuncFloatBottomUp(const void* a, const void* b) {
  if (*(float*)a > *(float*)b)
    return 1;
  else if (*(float*)a < *(float*)b)
    return -1;
  else
    return 0;
}


int main() {
  double dvalues[] = { 3.0, 1.0, 4.0, 2.0 };
  float fvalues[] = { 3.0f, 1.0f, 4.0f, 2.0f };

  // sort top down
  qsort(dvalues, 4, sizeof(double), cmpfuncDoubleTopDown);
  qsort(fvalues, 4, sizeof(float), cmpfuncFloatTopDown);

  for (int i = 0; i < 4; i++)
    printf("%f ", fvalues[i]);

  printf("\n");

  for (int i = 0; i < 4; i++)
    printf("%f ", dvalues[i]);

  printf("\n");

  // sort bottum up
  qsort(dvalues, 4, sizeof(double), cmpfuncDoubleBottomUp);
  qsort(fvalues, 4, sizeof(float), cmpfuncFloatBottomUp);

  for (int i = 0; i < 4; i++)
    printf("%f ", fvalues[i]);

  printf("\n");

  for (int i = 0; i < 4; i++)
    printf("%f ", dvalues[i]);

  printf("\n");
}

推荐阅读