導師佈置給我的第一個小作業:void型指針以及qsort排序小結
在C語言庫函數<stdlib.h>中就包含着qsort函數,qsort函數聲明如下:
void qsort(void * base,size_t nmemb,size_t size ,int(*compar)(const void *,const void *));所以,原來調用這個函數,就可以進行各種類型,且根據用戶的需求來改變排序方法的排序了。
補充知識:
·qsort()原型:
- 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,指向函數的指針也即函數指針。這個函數用來比較兩個數組元素,第一個參數大於,等於,小於第二個參數時,分別顯示正值,零,負值。
下面看幾個例子:
- #include<stdio.h>
- #include<stdlib.h>
- #include<math.h>
- #include<string.h>
- void main(void)
- {
- int i;
- int a[10]={0,1,2,3,4,5,6,7,8,9};
- char b[10]={'a','b','c','d','e','f','g','h','i','j'};
- double c[10]={0.1,0.2,0.9,0.5,0.3,0.6,0.7,0.8,1.1,1.2};
- int cmp1(const void * a,const void * b)
- {
- return (*(int*)a-*(int*)b);//a>b 返回正值
- }
- int cmp2(const void * a,const void *b)
- {
- return(*(char*)a-*(char*)b);
- }
- int cmp3(const void * a,const void * b)
- {
- if(fabs(*(double*)a-*(double *)b)<1*exp(-20))
- return 0;
- else
- return(((*(double*)a-*(double*)b)>0)?1:-1);
- }
- qsort(a,10,sizeof(int),&cmp1);//對於函數指針(指向函數的指針),直接傳入函數名和函數名進行&
- //運算都是可以的,因爲在調用函數時也是取的函數的地址
- qsort(b,10,sizeof(char),cmp2);
- qsort(c,10,sizeof(double),cmp3);
- for(i=0;i<10;i++)
- printf("%d ",a[i]);
- for(i=0;i<10;i++)
- printf("%c ",b[i]);
- for(i=0;i<10;i++)
- printf("%lf ",c[i]);
- }
·qsort()實現方式
- #include<stdio.h>
- #include<stdlib.h>
- int compare(const void *elem1, const void *elem2) //比較方式
- {
- const int *str1 = (const int *)elem1;
- const int *str2 = (const int *)elem2;
- return *str1>*str2; //">"升序,“<"降序
- }
- void sort(void *base, size_t num,size_t byte, int(*cmp)(const void *elem1, const *elem2))
- {
- char *str = (char *)base;
- int flag = 0;
- const void *p1;
- const void *p2;
- for (size_t i = 0; i < num - 1; i++)
- {
- flag = 0;
- for (size_t j = 0; j < num - 1 - i; j++)
- {
- p1 =(const void *)(str+(j*byte));
- p2 = (const void *)(str+(j + 1)*byte);
- if (cmp(p1,p2))
- {
- for (size_t k = 0; k < byte; k++) //按字節交換
- {
- str[j*byte + k] = str[j*byte + k] + str[(j + 1)*byte + k];
- str[(j+1)*byte + k] = str[j*byte + k] - str[(j + 1)*byte + k];
- str[j*byte + k] = str[j*byte + k]-str[(j + 1)*byte + k];
- }
- flag = 1;
- }
- }
- if (!flag)
- break;
- }
- }
- int main()
- {
- int(*cmp)(const void *elem1, const *elem2)=compare;
- int arr[4] = { 20,40,5, 4 };
- sort(arr,4,4, cmp);
- for (int i = 0; i < 4; i++)
- {
- printf("%d ", arr[i]);
- }
- printf("\n");
- system("pause");
- return 0;
- }
參考來源:
qsort用法:https://blog.csdn.net/zhaozicang/article/details/24174965
qsort實現:https://blog.csdn.net/LF_2016/article/details/51383212