一文帶你學(xué)會(huì)C語(yǔ)言中的qsort函數(shù)
鋪墊知識(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*無(wú)類型的指針,能夠接受各種類型的參數(shù),這樣的話,我們就能傳各種類型的參數(shù)
void*的注意事項(xiàng)
由于void是無(wú)類型指針,所以
1、void類型指針不能進(jìn)行加減整數(shù)的操作(不知道步長(zhǎng))
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)換后,就知道了步長(zhǎng),使用減法來(lái)比較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;
};
//以名字來(lái)對(duì)結(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;
};
//以年齡來(lái)對(duì)結(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é)會(huì)C語(yǔ)言中的qsort函數(shù)的文章就介紹到這了,更多相關(guān)C語(yǔ)言 qsort函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)詳解
大家好,本篇文章主要講的是C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
C++實(shí)現(xiàn)路口交通燈模擬系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)路口交通燈模擬系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C++?ASIO實(shí)現(xiàn)異步套接字管理詳解
Boost?ASIO(Asynchronous?I/O)是一個(gè)用于異步I/O操作的C++庫(kù),該框架提供了一種方便的方式來(lái)處理網(wǎng)絡(luò)通信、多線程編程和異步操作,本文介紹了如何通過(guò)ASIO框架實(shí)現(xiàn)一個(gè)簡(jiǎn)單的異步網(wǎng)絡(luò)套接字應(yīng)用程序,需要的可以參考下2023-08-08
C語(yǔ)言實(shí)現(xiàn)超市信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)超市信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

