zoukankan      html  css  js  c++  java
  • 关于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]之后的元素其实并未赋予初值,在排序过程中出现了错误;所以无法正常使用。

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

  • 相关阅读:
    正则表达式匹配
    最长回文子串
    无重复字符的最长子串
    n个骰子的点数之和
    关于模型选择
    最小堆
    kmeans++
    Dijkstra 算法
    mapreduce中获取输入文件的路径
    mapreduce数据不平衡时的处理方法
  • 原文地址:https://www.cnblogs.com/wangkundentisy/p/3456576.html
Copyright © 2011-2022 走看看