• 关于c语言中qsort函数的一点心得


     今天写c时无意间用到了排序,便想着使用c语言标准库中提供的排序函数,即qsort函数(c++stl中提供了sort函数用于排序),首先是介绍qsort函数的一些基本用法(以下内容主要参考:

    http://www.cppblog.com/qywyh/articles/3405.html

    七种qsort排序方法 

    <本文中排序都是采用的从小到大排序> 

    一、对int类型数组排序 

    int num[100]; 

    Sample: 

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

    qsort(num,100,sizeof(num[0]),cmp); 

    二、对char类型数组排序(同int类型) 

    char word[100]; 

    Sample: 

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

    qsort(word,100,sizeof(word[0]),cmp); 

    三、对double类型数组排序(特别要注意) 

    double in[100]; 

    int cmp( const void *a , const void *b ) 
    { 
    return *(double *)a > *(double *)b ? 1 : -1; 
    } 

    qsort(in,100,sizeof(in[0]),cmp); 

    四、对结构体一级排序 

    struct In 
    { 
    double data; 
    int other; 
    }s[100] 

    //按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写 

    int cmp( const void *a ,const void *b) 
    { 
    return (*(In *)a)->data > (*(In *)b)->data ? 1 : -1; 
    } 

    qsort(s,100,sizeof(s[0]),cmp); 

    五、对结构体二级排序 

    struct In 
    { 
    int x; 
    int y; 
    }s[100]; 

    //按照x从小到大排序,当x相等时按照y从大到小排序 

    int cmp( const void *a , const void *b ) 
    { 
    struct In *c = (In *)a; 
    struct In *d = (In *)b; 
    if(c->x != d->x) return c->x - d->x; 
    else return d->y - c->y; 
    } 

    qsort(s,100,sizeof(s[0]),cmp); 

    六、对字符串进行排序 

    struct In 
    { 
    int data; 
    char str[100]; 
    }s[100]; 

    //按照结构体中字符串str的字典顺序排序 

    int cmp ( const void *a , const void *b ) 
    { 
    return strcmp( (*(In *)a)->str , (*(In *)b)->str ); 
    } 

    qsort(s,100,sizeof(s[0]),cmp); 

    七、计算几何中求凸包的cmp 

    int cmp(const void *a,const void *b) //重点cmp函数,把除了1点外的所有点,旋转角度排序 
    { 
    struct point *c=(point *)a; 
    struct point *d=(point *)b; 
    if( calc(*c,*d,p[1]) < 0) return 1; 
    else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //如果在一条直线上,则把远的放在前面 
    return 1; 
    else return -1; 
    } 

    PS: 

    其中的qsort函数包含在<stdlib.h>的头文件里,strcmp包含在<string.h>的头文件里

    但我在实际应用中发现了一些问题:

    首先我的实例1:

    #include<stdio.h>
    #include<stdlib.h>
    
    int cmp(const void *a, const void *b)
    {
        return *(int*)a - *(int*)b;
    }
    int main()
    {
    
        int i = 0;
        int num[10] = {1,2,4,5,6};
        qsort(num,10,sizeof(num[0]),cmp);
        for(i = 0; i < 5; ++i)
        printf("%d ",num[i]);
    
    }
    

     此时输出的结果为5个0.

    而实例2:

    #include<stdio.h>
    #include<stdlib.h>
    
    int cmp(const void *a, const void *b)
    {
        return *(int*)a - *(int*)b;
    }
    int main()
    {
    
        int i = 0;
        int num[10] = {1,2,4,5,6};
        qsort(num,5,sizeof(num[0]),cmp);
        for(i = 0; i < 5; ++i)
        printf("%d ",num[i]);
    
    }
    

     则能输出正确的结果,即第二个参数应为数组的实际长度。

    经比较发现我所建立的实例数组num并没有全部初始化,num[4]之后的元素其实并未赋予初值,在排序过程中出现了错误;所以无法正常使用。

    所以数组在建立后最好初始化,否则,可能会出现意想不到的错误.

  • 相关阅读:
    java编程思想概括(第二章)一切都是对象
    java编程思想概括(第六章)复用类
    .net程序在无.net环境下运行
    一个让人哭笑不得的触发器
    iReaper for android
    博易博客删除垃圾评论
    解决博易2.0版分页问题
    允许更新此预编译站点的作用
    java包的命名规则技巧
    简易拨号器iCall
  • 原文地址:https://www.cnblogs.com/wangkundentisy/p/3456576.html
Copyright © 2020-2023  润新知