void型指針以及qsort排序小結

導師佈置給我的第一個小作業:void型指針以及qsort排序小結

在C語言庫函數<stdlib.h>中就包含着qsort函數,qsort函數聲明如下:

void qsort(void * base,size_t nmemb,size_t size ,int(*compar)(const void *,const void *));所以,原來調用這個函數,就可以進行各種類型,且根據用戶的需求來改變排序方法的排序了。

補充知識:

size_t在C語言中就有了。
它是一種“整型”類型,裏面保存的是一個整數,就像int, long那樣。這種整數用來記錄一個大小(size)。size_t的全稱應該是size type,就是說“一種用來記錄大小的數據類型”。
通常我們用sizeof(XXX)操作,這個操作所得到的結果就是size_t類型。
因爲size_t類型的數據其實是保存了一個整數,所以它也可以做加減乘除,也可以轉化爲int並賦值給int類型的變量。

·qsort()原型

  1. void qsort( void *base, size_t num, size_t width, int (*compare)(const void *elem1, const void *elem2 ))  

base:要排序的的數組的首地址


num:要排序的元素的個數


width:元素所佔的字節數


compare:函數指針,指向排序方式這個函數的指針。其中比較方式這個函數需要用戶根據自己的需要


使用qsort要調用<stdlib.h>


·qsort()用法:

參數說明:

base,要排序的數組

nmemb,數組中元素的數目

size,每個數組元素佔用的內存空間,可使用sizeof函數獲得

compar,指向函數的指針也即函數指針。這個函數用來比較兩個數組元素,第一個參數大於,等於,小於第二個參數時,分別顯示正值,零,負值。

下面看幾個例子:

  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. #include<math.h>  
  4. #include<string.h>  
  5.   
  6. void main(void)  
  7. {  
  8.     int i;  
  9.     int a[10]={0,1,2,3,4,5,6,7,8,9};  
  10.     char b[10]={'a','b','c','d','e','f','g','h','i','j'};  
  11.     double c[10]={0.1,0.2,0.9,0.5,0.3,0.6,0.7,0.8,1.1,1.2};  
  12.     int cmp1(const void * a,const void * b)  
  13.     {  
  14.         return (*(int*)a-*(int*)b);//a>b 返回正值  
  15.     }  
  16.   
  17.     int cmp2(const void * a,const void *b)  
  18.     {  
  19.         return(*(char*)a-*(char*)b);  
  20.     }  
  21.     int cmp3(const void * a,const void * b)  
  22.     {  
  23.         if(fabs(*(double*)a-*(double *)b)<1*exp(-20))  
  24.             return 0;  
  25.         else  
  26.             return(((*(double*)a-*(double*)b)>0)?1:-1);  
  27.     }  
  28.   
  29.     qsort(a,10,sizeof(int),&cmp1);//對於函數指針(指向函數的指針),直接傳入函數名和函數名進行&  
  30.                                   //運算都是可以的,因爲在調用函數時也是取的函數的地址  
  31.     qsort(b,10,sizeof(char),cmp2);  
  32.     qsort(c,10,sizeof(double),cmp3);  
  33.     for(i=0;i<10;i++)  
  34.         printf("%d ",a[i]);  
  35.     for(i=0;i<10;i++)  
  36.         printf("%c ",b[i]);  
  37.     for(i=0;i<10;i++)  
  38.         printf("%lf ",c[i]);  
  39. }  

·qsort()實現方式

  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. int compare(const void *elem1, const void *elem2)   //比較方式  
  4. {  
  5.     const int *str1 = (const int *)elem1;  
  6.     const int *str2 = (const int *)elem2;  
  7.     return *str1>*str2;                         //">"升序,“<"降序  
  8. }  
  9. void sort(void *base, size_t num,size_t byte, int(*cmp)(const void *elem1, const *elem2))  
  10. {  
  11.     char *str = (char *)base;  
  12.     int flag = 0;  
  13.     const void *p1;  
  14.     const void *p2;  
  15.     for (size_t i = 0; i < num - 1; i++)  
  16.     {  
  17.         flag = 0;  
  18.         for (size_t j = 0; j < num - 1 - i; j++)  
  19.         {  
  20.                p1 =(const void *)(str+(j*byte));  
  21.                p2 = (const void *)(str+(j + 1)*byte);  
  22.                if (cmp(p1,p2))  
  23.            {  
  24.               for (size_t k = 0; k < byte; k++)           //按字節交換  
  25.               {  
  26.             str[j*byte + k] = str[j*byte + k] + str[(j + 1)*byte + k];  
  27.             str[(j+1)*byte + k] = str[j*byte + k] - str[(j + 1)*byte + k];  
  28.             str[j*byte + k] = str[j*byte + k]-str[(j + 1)*byte + k];  
  29.               }  
  30.               flag = 1;  
  31.         }  
  32.     }  
  33.     if (!flag)  
  34.     break;  
  35.     }  
  36. }  
  37. int main()  
  38. {  
  39.     int(*cmp)(const void *elem1, const *elem2)=compare;  
  40.     int arr[4] = { 20,40,5, 4 };  
  41.     sort(arr,4,4, cmp);  
  42.     for (int i = 0; i < 4; i++)  
  43.     {  
  44.         printf("%d ", arr[i]);  
  45.     }  
  46.     printf("\n");  
  47.     system("pause");  
  48.     return 0;  
  49. }  


參考來源:

qsort用法:https://blog.csdn.net/zhaozicang/article/details/24174965

qsort實現:https://blog.csdn.net/LF_2016/article/details/51383212 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章