一文帶你學(xué)會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)元素個(gè)數(shù)
- 參數(shù)3 數(shù)組內(nèi)每個(gè)元素大小,單位是字節(jié)
- 參數(shù)4 函數(shù)指針,由自己實(shí)現(xiàn),內(nèi)容是兩個(gè)元素的比較方法
void*
參數(shù)1和參數(shù)4中的void*無類型的指針,能夠接受各種類型的參數(shù),這樣的話,我們就能傳各種類型的參數(shù)
void*的注意事項(xiàng)
由于void是無類型指針,所以
1、void類型指針不能進(jìn)行加減整數(shù)的操作(不知道步長)
2、不能進(jìn)行解引用操作,
3、想要進(jìn)行這些操作,需要把void類型強(qiáng)制類型轉(zhuǎn)成所需要的類型才能操作,例如(int*)e1,就將void*類型的e1轉(zhuǎn)換為int*
使用qsort函數(shù)進(jìn)行整型數(shù)組的排序
在自己完成的in_cmp函數(shù)中,給出的是兩個(gè)元素的比較方法
- 正序排序時(shí),e1>e2,返回大于0的數(shù),e1==e2,返回0,e1<e2,返回小于0的數(shù)
- 逆序排序時(shí),e1>e2,返回小于0的數(shù),e1==e2,返回0,e1<e2,返回大于0的數(shù)
當(dāng)然,我們可以用強(qiáng)制類型轉(zhuǎn)換后,就知道了步長,使用減法來比較e1和e2的大小
#include<stdio.h> #include<stdlib.h> int int_cmp(const void* e1,const void* e2) { if(*(int*)e1 > *(int*)e2 )//先強(qiáng)制類型轉(zhuǎn)換,在解引用進(jì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ù)進(jìn)行浮點(diǎn)型數(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ù)進(jìn)行結(jié)構(gòu)體數(shù)組的排序
以學(xué)生信息結(jié)構(gòu)體為例,結(jié)構(gòu)體包括學(xué)生名字和學(xué)生年齡
以名字為基準(zhǔn)進(jìn)行比較
#include<stdio.h> #include<string.h> #include<stdlib.h> struct student { char name[10]; int age; }; //以名字來對結(jié)構(gòu)體進(jìn)行排序 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); } }
以年齡為基準(zhǔn)進(jìn)行比較
#include<stdio.h> #include<string.h> #include<stdlib.h> struct student { char name[10]; int age; }; //以年齡來對結(jié)構(gòu)體進(jìn)行排序 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); } }
到此這篇關(guān)于一文帶你學(xué)會C語言中的qsort函數(shù)的文章就介紹到這了,更多相關(guān)C語言 qsort函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)拼圖游戲代碼(graphics圖形庫)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)拼圖游戲代碼,帶有g(shù)raphics圖形庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05C語言實(shí)現(xiàn)數(shù)組元素排序方法詳解
這篇文章主要為大家介紹了C語言算法練習(xí)中數(shù)組元素排序的實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C語言有一定幫助,需要的可以參考一下2023-02-02C語言實(shí)現(xiàn)宿舍管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)宿舍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C++實(shí)現(xiàn)一鍵關(guān)閉桌面的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一鍵關(guān)閉桌面的功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-07-07