通用的排序函数qsort()对于double 类型数据排序时遇到的问题及解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36782456/article/details/88420740

qsort()是C标准库中的一个通用的排序函数.

qsort 的函数原型是:

void qsort (void* base, size_t num, size_t size, int (*compare)(const void*, const void*));

各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针

qsort既能对整型数据进行排序也能对浮点型数据进行排序.但我在练习使用qsort函数排序三种数据类型时(分别是: int, double, char)遇到了一个奇怪的情况,对于 int 和 char 类型的数据排序按照预期效果成功排序,数组中的数据仍然是乱序的.

问题程序如下:

问题代码
上面这个程序的输出结果为:
问题程序的输出结果
从结果中可以看出qsort()对double类型的数据并没有排序成功!

解决:

后来才发现,这个问题出在了比较函数compare1()上了。qsort()要求compare1()函数的返回值必须是int类型。如上图所示,compare()函数的返回值竟然不是int而是double类型。因此,将上述程序改写成下面的样子,问题解决。(没有截图,贴上了源代码)

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

int compare(const void* a,const void* b){
  return (*(int*)a - *(int*)b);
}

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

int compare2(const void* a,const void* b){
  return (*(char*)a - *(char*)b);
}

int main(){
  int arr[] = {3, 5, 7, 1, 4, 2, 6};
  qsort(&arr, 7, sizeof(arr[0]), compare);
  int i = 0;
  for( ; i < 7; ++i ){
    printf("%d ",arr[i]); 
  }
  printf("\n");
  
  double arr1[] = {3.24, 5.56, 7.77, 1.34, 4.45, 2.56, 6.78};
  qsort(&arr1, 7, sizeof(arr1[0]), compare1);
  int j = 0;
  for( ; j < 7; ++j ){
    printf("%lf ",arr1[j]); 
  }
  printf("\n");
  
  char arr2[] = {'d', 'e', 'a', 'c', 'b', 'f', 'g'};
  qsort(&arr2, 7, sizeof(arr2[0]), compare2);
  int k = 0;
  for( ; k < 7; ++k ){
    printf("%c ",arr2[k]); 
  }
  printf("\n");

  return 0;
}

排序成功的结果:
排序成功

展开阅读全文

没有更多推荐了,返回首页