c语言调用库函数qsort()进行快速排序

来源:互联网 发布:4g网络制式 编辑:程序博客网 时间:2024/04/30 08:20

转自:http://blog.csdn.net/wzy_1988/article/details/8544871

前言

各种排序方法中,例如冒泡、插入,快排等我最喜欢用快速排序,特别欣赏快排的分治思想,调用系统的qsort函数前希望大家也能了解一下快速排序的原理,参考链接见:http://blog.csdn.net/zinss26914/article/details/8043168

qsort函数原型

[cpp] view plaincopyprint?
  1. void qsort(void *base, size_t nmemb, size_t size, int(*compare) (const void *, const void *));  
函数原型在<stdlib.h>中找到

参数详解

[html] view plaincopyprint?
  1. base    : 指向数组中第一个元素(如果只是对数组的一段区域进行排序,那么要使base指向这段区域的第一个元素)  
  2. nmemb   : 要排序元素的数量  
  3. size    : 每个数组元素的大小,用字节来衡量  
  4. compare : 指向比较函数的指针  

重点

数组的元素可能是任何类型的,甚至可能是结构体或联合,所以必须告诉函数qsort如何确定两个数组元素哪一个“更小”。通过编写比较函数可以为qsort提供这些信息。当给定两个指向数组元素的指针p和q时,比较函数必须返回一个整数,如果*p小于*q,那么返回的数为负数;如果*p等于*q,那么返回0.如果*p大于*q,返回正数.按照这种结果返回,qsort对数组默认是升序排序.如果想降序,只需要将上述结果返回值*-1即可

测试用例

int&&char数组排序(c代码)

以int数组为测试例子,进行排序

[cpp] view plaincopyprint?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. int compi(const void *a, const void *b)  
  5. {  
  6.     const int *p = a;  
  7.     const int *q = b;  
  8.   
  9.     return *p - *q;  
  10. }  
  11.   
  12. int compd(const void *a, const void *b)  
  13. {  
  14.     const int *p = a;  
  15.     const int *q = b;  
  16.   
  17.     return (*p - *q) * (-1);  
  18. }  
  19.   
  20.   
  21. int main()  
  22. {  
  23.     int a[1000];  
  24.     int i, len, type;  
  25.   
  26.     while(scanf("%d %d", &len, &type) != EOF)  
  27.     {  
  28.         for(i = 0; i < len; i ++)  
  29.         {  
  30.             scanf("%d", &a[i]);  
  31.         }  
  32.   
  33.         switch(type)  
  34.         {  
  35.             case 1 :  
  36.                 //递增排序  
  37.                 qsort(a, len, sizeof(a[0]), compi);  
  38.                 break;  
  39.             case 2 :  
  40.                 //递减排序  
  41.                 qsort(a, len, sizeof(a[0]), compd);  
  42.                 break;  
  43.         }  
  44.   
  45.         if(type == 1)  
  46.         {  
  47.             printf("递增排序结果:\n");  
  48.         }else  
  49.         {  
  50.             printf("递减排序结果:\n");  
  51.         }  
  52.         for(i = 0; i < len; i ++)  
  53.         {  
  54.   
  55.             printf("%d ", a[i]);  
  56.         }  
  57.         printf("\n");  
  58.     }  
  59.     return 0;  
  60. }   

测试结果:




结构体数组排序

大同小异,简单的贴一道acm题,来说明结构体数组排序的方法吧

excel排序

[html] view plaincopyprint?
  1. 题目描述:  
  2.     Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。  
  3.     对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3   
  4. 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。  
  5. 输入:  
  6.     测试输入包含若干测试用例。每个测试用例的第1行包含两个整数 N (N<=100000) 和 C,其中 N 是纪录的条数,C 是指定排序的列号。以下有N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。  
  7. 输出:  
  8.     对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3   
  9. 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。  
  10. 样例输入:  
  11. 3 1  
  12. 000007 James 85  
  13. 000010 Amy 90  
  14. 000001 Zoe 60  
  15. 4 2  
  16. 000007 James 85  
  17. 000010 Amy 90  
  18. 000001 Zoe 60  
  19. 000002 James 98  
  20. 4 3  
  21. 000007 James 85  
  22. 000010 Amy 90  
  23. 000001 Zoe 60  
  24. 000002 James 90  
  25. 0 0  
  26. 样例输出:  
  27. Case 1:  
  28. 000001 Zoe 60  
  29. 000007 James 85  
  30. 000010 Amy 90  
  31. Case 2:  
  32. 000010 Amy 90  
  33. 000002 James 98  
  34. 000007 James 85  
  35. 000001 Zoe 60  
  36. Case 3:  
  37. 000001 Zoe 60  
  38. 000007 James 85  
  39. 000002 James 90  
  40. 000010 Amy 90  

ac代码

[cpp] view plaincopyprint?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.   
  5. struct student  
  6. {  
  7.     char num[7];  
  8.     char name[9];  
  9.     int grade;  
  10. };  
  11.   
  12. int compareByNum(const void *a, const void *b);  
  13. int compareByName(const void *a, const void *b);  
  14. int compareByGrade(const void *a, const void *b);  
  15.   
  16. int main()  
  17. {  
  18.     int i, n, k;  
  19.     struct student people[100001];  
  20.     static int size = 1;  
  21.   
  22.     while(scanf("%d %d", &n, &k) != EOF)  
  23.     {  
  24.         if(n == 0)  
  25.             break;  
  26.         //接收客户端数据  
  27.         for(i = 0; i < n; i ++)  
  28.         {  
  29.             scanf("%s %s %d", people[i].num, people[i].name, &people[i].grade);  
  30.         }  
  31.   
  32.         //快速排序  
  33.         switch(k)  
  34.         {  
  35.             case 1 :  
  36.                 //按学号排序  
  37.                 qsort(people, n, sizeof(people[0]), compareByNum);  
  38.                 break;  
  39.             case 2 :  
  40.                 //按姓名排序  
  41.                 qsort(people, n, sizeof(people[0]), compareByName);  
  42.                 break;  
  43.             case 3 :  
  44.                 //按成绩排序  
  45.                 qsort(people, n, sizeof(people[0]), compareByGrade);  
  46.                 break;  
  47.         }  
  48.   
  49.         //打印输出  
  50.         printf("Case %d:\n", size ++);  
  51.         for(i = 0; i < n; i ++)  
  52.         {  
  53.             printf("%s %s %d\n", people[i].num, people[i].name, people[i].grade);  
  54.         }  
  55.     }  
  56.   
  57.     return 0;  
  58. }  
  59.   
  60. int compareByNum(const void *a, const void *b)  
  61. {  
  62.     const struct student *p = a;  
  63.     const struct student *q = b;  
  64.   
  65.     return strcmp(p->num, q->num);      
  66. }  
  67.   
  68. int compareByName(const void *a, const void *b)  
  69. {  
  70.     const struct student *p = a;  
  71.     const struct student *q = b;  
  72.   
  73.     if(strcmp(p->name, q->name) > 0)  
  74.     {  
  75.         return 1;  
  76.     }else if(strcmp(p->name, q->name) == 0 && strcmp(p->num, q->num) > 0)  
  77.     {  
  78.         return 1;  
  79.     }else  
  80.     {  
  81.         return -1;  
  82.     }  
  83. }  
  84.   
  85. int compareByGrade(const void *a, const void *b)  
  86. {  
  87.     const struct student *p = a;  
  88.     const struct student *q = b;  
  89.   
  90.     if(p->grade > q->grade)  
  91.     {  
  92.         return 1;  
  93.     }else if(p->grade == q->grade && strcmp(p->num, q->num) > 0)  
  94.     {  
  95.         return 1;  
  96.     }else  
  97.     {  
  98.         return -1;  
  99.     }  
  100. }  

0 0
原创粉丝点击