分享

如何利用C语言中的qsort库函数实现快速排序?

 guitarhua 2016-05-25

之前,我们已经写过快速排序的程序,而在C语言的库函数中就有快速排序的库函数,即为qsort, 其用法如下:


功 能: 快速排序
头文件:stdlib.h
用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
参数: 
1 待排序数组首元素的地址 
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序


       示例程序如下:
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. int compInc(const void *a, const void *b)  
  5. {  
  6.     return *(int *)a - *(int *)b;  
  7. }  
  8.   
  9. int compDec(const void *a, const void *b)  
  10. {  
  11.     return *(int *)b - *(int *)a;  
  12. }  
  13.   
  14.   
  15. int main()  
  16. {  
  17.     int a[5] = {11,2,13,4,7};  
  18.     int b[5] = {11,2,13,4,7};  
  19.     int len = 5;  
  20.     int i;  
  21.   
  22.     printf("递增排序结果:\n");  
  23.     qsort(a, len, sizeof(a[0]), compInc);  
  24.     for(i = 0; i < len; i ++)  
  25.     {  
  26.         printf("%d ", a[i]);  
  27.     }  
  28.   
  29.     printf("\n\n");  
  30.   
  31.   
  32.     printf("递减排序结果:\n");  
  33.     qsort(b, len, sizeof(b[0]), compDec);  
  34.           
  35.     for(i = 0; i < len; i ++)  
  36.     {  
  37.           
  38.         printf("%d ", b[i]);  
  39.     }  
  40.   
  41.     printf("\n");  
  42.   
  43.     return 0;  
  44. }   
     结果为:
递增排序结果:
2 4 7 11 13

递减排序结果:
13 11 7 4 2


      下面,继续看qsort的一些用法:
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #define M 12  
  5. #define N 20  
  6.   
  7.   
  8. int compareInc(const void *a, const void *b)  
  9. {  
  10.     return strlen((char *)a) - strlen((char*)b);  
  11. }  
  12.   
  13. int compareDec(const void *a, const void *b)  
  14. {  
  15.     return strlen((char *)b) - strlen((char*)a);  
  16. }  
  17.   
  18. int main(void)  
  19. {  
  20.     int i;  
  21.     char s[M][N]=  
  22.     {  
  23.     "January",  
  24.     "February",  
  25.     "March",  
  26.     "April",  
  27.     "May",  
  28.     "June",  
  29.     "July",  
  30.     "August",  
  31.     "September",  
  32.     "October",  
  33.     "November",  
  34.     "December"  
  35.     };  
  36.   
  37.     qsort(s, M, sizeof(char) * N, compareInc);  
  38.     for(i = 0;i < M; i++)  
  39.         printf("%s\n", s[i]);  
  40.   
  41.     printf("\n");  
  42.   
  43.     qsort(s, M, sizeof(char) * N, compareDec);  
  44.     for(i = 0;i < M; i++)  
  45.         printf("%s\n", s[i]);  
  46.   
  47.     return 0;  
  48. }  
      结果为:
May
July
June
March
April
August
October
January
December
November
February
September

September
February
November
December
October
January
August
April
March
June
July
May


  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #define M 12  
  5. #define N 20  
  6.   
  7.   
  8. int compare1(const void *a, const void *b)  
  9. {  
  10.     return *(char *)a - *(char*)b;  
  11. }  
  12.   
  13. int compare2(const void *a, const void *b)  
  14. {  
  15.     return *(char *)b - *(char*)a;  
  16. }  
  17.   
  18. int main(void)  
  19. {  
  20.     int i;  
  21.     char s[M][N]=  
  22.     {  
  23.     "January",  
  24.     "February",  
  25.     "March",  
  26.     "April",  
  27.     "May",  
  28.     "June",  
  29.     "July",  
  30.     "August",  
  31.     "September",  
  32.     "October",  
  33.     "November",  
  34.     "December"  
  35.     };  
  36.   
  37.     qsort(s, M, sizeof(char) * N, compare1);  
  38.     for(i = 0;i < M; i++)  
  39.         printf("%s\n", s[i]);  
  40.   
  41.     printf("\n");  
  42.   
  43.     qsort(s, M, sizeof(char) * N, compare2);  
  44.     for(i = 0;i < M; i++)  
  45.         printf("%s\n", s[i]);  
  46.   
  47.     return 0;  
  48. }  
       结果为:
April
August
December
February
July
June
January
March
May
November
October
September

September
October
November
May
March
June
July
January
February
December
August
April


       好,欣赏最后一个qsort程序:
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #define N 6  
  4.   
  5. typedef struct  
  6. {  
  7.     char name[15];  
  8.     int  score;  
  9.   
  10. }Student;  
  11.   
  12. int compare1(const void *a,const void *b)  
  13. {  
  14.     return ((Student*)a)->score - ((Student*)b)->score;  
  15. }  
  16.   
  17. int compare2(const void *a,const void *b)  
  18. {  
  19.     return *(((Student*)a)->name) - *(((Student*)b)->name);  
  20. }  
  21.   
  22. void print(Student s)  
  23. {  
  24.     printf("%-15s : %d\n", s.name, s.score);  
  25. }  
  26.   
  27. int main()  
  28. {  
  29.     Student s[N] =  
  30.     {  
  31.     "Zhang San", 94,  
  32.     "Li Si",     80,  
  33.     "You",       94,  
  34.     "I",        100,  
  35.     "He",        72,  
  36.     "She",       60  
  37.     };  
  38.   
  39.     int i;  
  40.     qsort(s, N, sizeof(Student), compare1);  
  41.     for(i = 0; i < N; i++)  
  42.     {  
  43.         print(s[i]);  
  44.     }  
  45.   
  46.     printf("\n");  
  47.   
  48.     qsort(s, N, sizeof(Student), compare2);  
  49.     for(i = 0; i < N; i++)  
  50.     {  
  51.         print(s[i]);  
  52.     }  
  53.   
  54.     return 0;  
  55. }  
       结果为:
She             : 60
He              : 72
Li Si           : 80
You             : 94
Zhang San       : 94
I               : 100

He              : 72
I               : 100
Li Si           : 80
She             : 60
You             : 94
Zhang San       : 94


2
0

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多