一文帶你學會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類型強制類型轉成所需要的類型才能操作,例如(int*)e1,就將void*類型的e1轉換為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ù)
當然,我們可以用強制類型轉換后,就知道了步長,使用減法來比較e1和e2的大小
#include<stdio.h> #include<stdlib.h> int int_cmp(const void* e1,const void* e2) { if(*(int*)e1 > *(int*)e2 )//先強制類型轉換,在解引用進行比較 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ù)進行結構體數(shù)組的排序
以學生信息結構體為例,結構體包括學生名字和學生年齡
以名字為基準進行比較
#include<stdio.h> #include<string.h> #include<stdlib.h> struct student { char name[10]; int age; }; //以名字來對結構體進行排序 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; }; //以年齡來對結構體進行排序 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