zoukankan      html  css  js  c++  java
  • C语言中qsort函数用法

    最近在刷PAT时C语言中qsort函数的使用极多,所以在这里总结整理了一下,需要的朋友可以参考下。

    C语言中qsort函数的用法实例详解

    • 快速排序是一种用的最多的排序算法,在C语言的标准库中也有快速排序的函数,下面说一下详细用法。
    • qsort函数包含在<stdlib.h>中
    • qsort函数声明如下:
    void qsort(void * base,size_t nmemb,size_t size ,int(*compar)(const void *,const void *));
    

    参数说明:

    • base,要排序的数组
    • nmemb,数组中元素的数目
    • size,每个数组元素占用的内存空间,可使用sizeof函数获得
    • compar,指向函数的指针也即函数指针。这个函数用来比较两个数组元素,第一个参数大于,等于,小于第二个参数时,分别显示正值,零,负值。

    用法实例小结

    C语言中的qsort函数包含在<stdlib.h>的头文件里,排序默认都是采用的从小到大排序。

    • (如果要降序排序,只需将return里的a,b反过来写即可。)

    一、对int类型数组排序

    int num[100]; 
     
    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]; 
    int cmp( const void *a , const void *b ) 
    { 
      return *(char *)a - *(char *)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 node
    {
       double one;
       int two;
    } s[100];
    
    • 完整代码
    struct node
    {
       double one;
       int two;
    } s[100];
    
    int cmp( const void *a ,const void *b)
    {
    return ( * (node * )a).one > ( * (node * )b).one ? 1 : -1;
    }
    qsort(s,100,sizeof(s[0]),cmp); 
    

    五、对结构体二级排序

    struct node
    {
       double one;
       int two;
    } s[100];
    
    //按照x从小到大排序,当x相等时按照y从大到小排序 
    int cmp( const void *a , const void *b )
    {
    if((* (node * )a).one != ( * (node * )b).one)
    return ( * (node * )a).one > ( * (node * )b).one ? 1 : -1;
    else return (* (node * )a).two -( * (node * )b).two;
    }
    qsort(s,100,sizeof(s[0]),cmp);
    

    六、对字符串进行排序

    char am = { {"...."}, {"....."}, .....};
    //根据字符串首字母排序
    int cmp(const void *a, const void *b)  
    {  
    	return * (char *)a - *(char * )b;  
    } 
    qsort(a, m, sizeof(char * )  * n, cmp); 
    
    
    char am = { {"...."}, {"....."}, .....};
    //根据字符串长度排序
    int cmp(const void *a, const void *b)  
    {  
    	return strlen((char * )a) > strlen((char * )b) ? 1 : -1;  
    } 
    qsort(a, m, sizeof(char * )  * n, cmp);
    
    
    char am = { {"...."}, {"....."}, .....};
    //按照结构体中字符串str的字典顺序排序 
    int cmp(const void *a, const void *b)
    {
    	return (strcmp((char *)a, (char *)b));
    }
    qsort(a, m, sizeof(char * )  * n, 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;
    }
    

    具体样例

    1.int类型数组排序

    #include<stdio.h>
    #include<stdlib.h>
    #define L 20
    int cmp(const void *a, const void *b)
    {
    	return *(int *)a - *(int *)b;
     } 
    int main (){
    	int a[L] = {0, 5, 2, 3, 4, 9, 8, 7, 6, 1,
    		11, 15, 14, 12, 13, 16, 17, 18, 19, 10};
    	qsort(a, L, sizeof(int), cmp);
    	for (int i = 0; i < L; i++){
    		printf("%d ", a[i]);
    	}
     } 
    

    2.double类型数组排序

    #include<stdio.h>
    #include<stdlib.h>
    #define L 20
    int cmp(const void *a, const void *b)
    {
    	return *(double *)a > *(double *)b? 1 : -1;
     } 
    int main (){
    	double a[L] = {0.1, 0.11, 1.1, 1.5, 1.8, 1.51, 2.5, 2.9, 1.3, 0.8, 
    		15.5, 7.9, 8.5, 8.51, 8.6, 3, 1.41, 1.11, 1.51, 2};
    	qsort(a, L, sizeof(double), cmp);
    	for (int i = 0; i < L; i++){
    		printf("%.2lf
    ", a[i]);
    	}
     } 
    

    3.char类型数组排序

    #include<stdio.h>
    #include<stdlib.h>
    #define L 20
    int cmp(const void *a, const void *b)
    {
    	return *(char *)a - *(char *)b;
     } 
    int main (){
    	char a[L] = {'q', 'w', 'r', 'h', 'a', 'v', 'g', 'e', 'b', 'l',
    		'o', 'p', 'u', 'y', 't', 'c', 'x', 'i', 'z', 's'};
    	qsort(a, L, sizeof(char), cmp);
    	for (int i = 0; i < L; i++){
    		printf("%c ", a[i]);
    	}
     } 
    

    4.字符串进行排序

    • 按首字母排序
    #include<stdio.h>
    #include<stdlib.h>
    #define L 10
    #define K 10
    int cmp(const void *a, const void *b)
    {
    	return *(char *)a - *(char *)b;
     } 
    int main (){
    	char a[L][K] = {
    		"rbsgc",
    		"jcghse",
    		"gfgd",
    		"abbbs",
    		"bbbvs",
    		"cbfgfe",
    		"drgafg" ,
    		"ewqgrta",
    		"ofggd",
    		"mbgcv",
    	};
    	qsort(a, L, sizeof(char) * K, cmp);
    	for (int i = 0; i < L; i++){
    		printf("%s
    ", a[i]);
    	}
     } 
    
    
    • 按长度排序
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define L 10
    #define K 10
    int cmp(const void *a, const void *b)
    {
    	return strlen((char *)a) > strlen((char *)b) ? 1 : -1;
     } 
    int main (){
    	char a[L][K] = {
    		"rbsgc",
    		"jcghse",
    		"gfgd",
    		"abbbs",
    		"bbbvs",
    		"cbfgfe",
    		"drgafg" ,
    		"ewqgrta",
    		"ofggd",
    		"mbgcv",
    	};
    	qsort(a, L, sizeof(char) * K, cmp);
    	for (int i = 0; i < L; i++){
    		printf("%s
    ", a[i]);
    	}
     } 
    
    • 按字典顺序
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define L 10
    #define K 10
    int cmp(const void *a, const void *b)
    {
    	return strcmp((char * )a, (char *)b);
     } 
    int main (){
    	char a[L][K] = {
    		"rbsgc",
    		"jcghse",
    		"gfgd",
    		"abbbs",
    		"bbbvs",
    		"cbfgfe",
    		"drgafg" ,
    		"ewqgrta",
    		"ofggd",
    		"mbgcv",
    	};
    	qsort(a, L, sizeof(char) * K, cmp);
    	for (int i = 0; i < L; i++){
    		printf("%s
    ", a[i]);
    	}
     } 
    

    5.结构体二级排序

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define L 10
    typedef struct node {
     	double first;
     	int numb;
     }node;
    int cmp(const void *a, const void *b)
    {
    	if((* (node *)a).first != ( * (node *)b).first)
    	return ( * (node * )a).first > ( * (node * )b).first ? 1 : -1;
    	else return (* (node * )a).numb -( * (node * )b).numb;
    
     } 
    int main (){
    	node arr[L] = {
    		1.0, 1,
    		2.0, 2,
    		1.1, 3,
    		2.1, 4,
    		3.5, 5,
    		1.0, 6,
    		1.1, 7,
    		5.1, 8,
    		5.0, 9,
    		3.6, 10,
    		
    	};
    	qsort(arr, L, sizeof(node), cmp);
    	for (int i = 0; i < L; i++){
    		printf("%.2lf %d
    ", arr[i].first, arr[i].numb);
    	}
     } 
    

    参考博文

    欢迎查阅
  • 相关阅读:
    rebar
    namenode ha
    jmx
    doclint in jdk8
    maven source
    avd
    ccw-ide
    ST3使用
    Web worker
    离线web-ApplicationCache
  • 原文地址:https://www.cnblogs.com/gh110/p/12158181.html
Copyright © 2011-2022 走看看