qsort结构体排序_用C标准库中的qsort函数实现线性插值法求值

点击上方公众号名称关注,获得更多内容

qsort结构体排序_用C标准库中的qsort函数实现线性插值法求值_第1张图片 ✎ 编 者 悟 语

     生活有时要得就是一股劲,进行一次次的冲锋。

文 章 导 读

   今天给大家介绍下线性插值法的用法,用C标准库函数中的qsort排序函数进行排序,并用比较法确定插值的亮点范围,抛转引玉,大家可以根据需要进行算法的优化哈,希望对小伙伴们有所帮助哈,ab42b3ceeaff62f8824462693bfc8db8.png

1线性插值法简介

    线性插值法是一种简单实用的数值预测方式。

    插值法示意图如下。

qsort结构体排序_用C标准库中的qsort函数实现线性插值法求值_第2张图片

    简单来说,线性插值法就是两点决定一条直线,通过两点可以求出直线方程,如果已知x就可以求y,已知y也可以求x。

    但在实际中,决定直线的点有很多,可以求出很多方程,此时就需要根据坐标来确定就近的两点确定直线去求值,就近两点的确定,下面用排序比较法来确定。

2C标志库中的插值函数

    1)函数功能

    函数qsort对一个包含nmemb个数组对象进行排序,其第一元素由base指向,数值中的每个元素的大小由size指定。

    2)函数原型


void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void*,const void *))

    3)头文件


   #include

    4)参数说明

    base:指向第一元素。

    nmemb:排序对象的个数。

    size:每个元素的大小。

    compar:它指向的比较函数将数组内容排成升序。

    函数的参数分别指向两个数组元素的指针。

    如果第一个元素小于、等于或大于第二个元素,则函数分别返回小于0、等于0和大于0的整数。

    如果比较的两个元素相等,则没有指定它们在排列后的数值中的

    5)返回值

    无返回值。

3代码实现线性插值法求值

    实现代码如下:


#include
#include// 数值点的个数
#define  NUM   6// 函数声明int cmp(const void *a,const void *b);float linear_interpolation(float *x);// 全局变量x的值float xval = 4.5;int main(){ float ret;
     printf("\nx = %f\n\n",xval);
     ret = linear_interpolation(&xval);
     printf("\n\ny = y0 + ( (y1 - y0) / (x1 - x0) ) * (x - x0) = %f",ret);return 0;
}float linear_interpolation(float *x){ int i, j, k, t = 2;float *x0,*y0;float *x1,*y1;float *y = (float*)malloc(sizeof(float));// 数值点的值float array[NUM][2]={
     { 7,6},
     { 2,1},
     { 5,9},
     { 3,5},
     { 7,9},
     { 4,2}
     };// 打印原数据for(i=0;i     { for(j=0;j<2;j++)
           {
                printf("%8.2f ",array[i][j]);
           }
           printf("\n");
    }
    printf("\n");
    qsort(array,NUM,sizeof(array[0]),cmp);// 打印排序后的新数据 for(i = 0; i     { for(j = 0; j 2;j++)
         {
               printf("%8.2f ",array[i][j]); 
         }
         printf("\n");
    }for(k = 0; k  { // 找到插值位置 if(array[k][0] >= xval) 
       {
             t = k;  // 记录下标 break;    
       }
 }
 printf("\nt = %d\n\n",t);
 y0 = &array[t][1];
 x0 = &array[t][0];
 printf("x0 = %f\t",*x0);
 printf("y0 = %f\n",*y0);if(t == 0) //等于零向上查找 
 {
      y1 = &array[t+1][1];
      x1 = &array[t+1][0];
      printf("x1 = %f\t",*x1);
      printf("y1 = %f\n",*y1); 
 } else      //不等于零向下查找 
 {
      y1 = &array[t-1][1];
      x1 = &array[t-1][0];
      printf("x1 = %f\t",*x1);
      printf("y1 = %f\n",*y1);
 } if(*x1 == *x0)
 {
      printf("\n除数不能为0!");
 }else
 {
      *y = *y0 + ( (*y1 - *y0) / (*x1 - *x0) ) * (*x - *x0); 
 }return *y; 
}int cmp(const void *a,const void *b){ int *c = (int *)a;int *d = (int *)b;if(*c != *d)
      { return *c - *d;
      }else
      { return *(d+1) - *(c+1);
      }      
}

    运行结果如下图所示。

qsort结构体排序_用C标准库中的qsort函数实现线性插值法求值_第3张图片

总结

    进用C标准库中的qsort函数验证了一下线性插值法的使用,大家可以根据自己的项目进行算法优化哈,后面还会有C语言相关的内容,大家敬请期待哈,af7f3ee37c447e30220a336a2036e668.png

    有问题可以后台留言交流,公众号18年后新申请的,文章后不支持留言功能的。

相关文章:

编程意识篇——用结构存储数据以减少函数二次调用,能替代return返回值吗

C代码实现16位和32位数据字节序转换

C语言中一个分号的奇迹(预处理、指针、结构体、内存分配)——一段暗藏玄机的代码

malloc为什么不能在函数体外给全局变量分配内存

宏分类的妙用(排版开始用模板)

用结构体和指针模拟配置芯片引脚输出高低电平

进化论——从函数指针到被结构封装的函数指针及参数的应用举例

专辑推荐:

Python技能专辑

C语言专辑

IDE调试专辑

软件推荐专辑

软实力专辑

Linux专辑

扫码关注我们

qsort结构体排序_用C标准库中的qsort函数实现线性插值法求值_第4张图片

e239f6432e7d17d31b97f479cbd8d73d.gif Game Over!

你可能感兴趣的:(qsort结构体排序)