一文帶你學會C語言中的qsort函數(shù)
鋪墊知識
qsort函數(shù)
參數(shù)類型
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
參數(shù)類型解釋
- 參數(shù)1 待排序數(shù)組首元素的地址
- 參數(shù)2 數(shù)組內(nèi)元素個數(shù)
- 參數(shù)3 數(shù)組內(nèi)每個元素大小,單位是字節(jié)
- 參數(shù)4 函數(shù)指針,由自己實現(xiàn),內(nèi)容是兩個元素的比較方法
void*
參數(shù)1和參數(shù)4中的void*無類型的指針,能夠接受各種類型的參數(shù),這樣的話,我們就能傳各種類型的參數(shù)
void*的注意事項
由于void是無類型指針,所以
1、void類型指針不能進行加減整數(shù)的操作(不知道步長)
2、不能進行解引用操作,
3、想要進行這些操作,需要把void類型強制類型轉(zhuǎn)成所需要的類型才能操作,例如(int*)e1,就將void*類型的e1轉(zhuǎn)換為int*
使用qsort函數(shù)進行整型數(shù)組的排序
在自己完成的in_cmp函數(shù)中,給出的是兩個元素的比較方法
- 正序排序時,e1>e2,返回大于0的數(shù),e1==e2,返回0,e1<e2,返回小于0的數(shù)
- 逆序排序時,e1>e2,返回小于0的數(shù),e1==e2,返回0,e1<e2,返回大于0的數(shù)
當然,我們可以用強制類型轉(zhuǎn)換后,就知道了步長,使用減法來比較e1和e2的大小
#include<stdio.h>
#include<stdlib.h>
int int_cmp(const void* e1,const void* e2)
{
if(*(int*)e1 > *(int*)e2 )//先強制類型轉(zhuǎn)換,在解引用進行比較
return 1;
else if(*(int*)e1 == *(int*)e2 )
return 0;
else
return -1;
}
int main()
{
int i=0;
int arr[10]={1,4,0,5,8,9,2,3,6,7};
int sz=sizeof(arr)/sizeof(arr[0]);
qsort(arr,sz,sizeof(arr[0]),int_cmp);
for(i=0;i<sz;i++)
printf("%d ",arr[i]);
return 0;
}
使用qsort函數(shù)進行浮點型數(shù)組的排序
#include<stdio.h>
#include<stdlib.h>
int float_cmp(const void* e1,const void* e2)
{
return *(float*)e1 - *(float*)e2;
}
int main()
{
int i=0;
float arr[5]={1.0,3.5,2.2,7.3,5.5};
int sz=sizeof(arr)/sizeof(arr[0]);
qsort(arr,sz,sizeof(arr[0]),float_cmp);
for(i=0;i<sz;i++)
printf("%.1f ",arr[i]);
return 0;
}
使用qsort函數(shù)進行結(jié)構(gòu)體數(shù)組的排序
以學生信息結(jié)構(gòu)體為例,結(jié)構(gòu)體包括學生名字和學生年齡
以名字為基準進行比較
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
char name[10];
int age;
};
//以名字來對結(jié)構(gòu)體進行排序
int struct_cmp_byname(const void* e1, const void* e2)
{
return strcmp(((struct student*)e1)->name, ((struct student*)e2)->name);
}
int main()
{
int i=0;
struct student stu[3] = { {"張三",20},{"李四",19},{"王五",18}};
int sz = sizeof(stu) / sizeof(stu[0]);
qsort(stu, sz, sizeof(stu[0]), struct_cmp_byname);
for (i = 0; i < sz; i++)
{
printf("%s %d\n", stu[i].name, stu[i].age);
}
}
以年齡為基準進行比較
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
char name[10];
int age;
};
//以年齡來對結(jié)構(gòu)體進行排序
int struct_cmp_byage(const void* e1, const void* e2)
{
return ((struct student*)e1)->age - ((struct student*)e2)->age;
}
int main()
{
int i=0;
struct student stu[3] = { {"張三",20},{"李四",19},{"王五",18}};
int sz = sizeof(stu) / sizeof(stu[0]);
qsort(stu, sz, sizeof(stu[0]), struct_cmp_byage);
for (i = 0; i < sz; i++)
{
printf("%s %d\n", stu[i].name, stu[i].age);
}
}
到此這篇關于一文帶你學會C語言中的qsort函數(shù)的文章就介紹到這了,更多相關C語言 qsort函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++實現(xiàn)拼圖游戲代碼(graphics圖形庫)
這篇文章主要為大家詳細介紹了C++實現(xiàn)拼圖游戲代碼,帶有graphics圖形庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05

