網(wǎng)站首頁 編程語言 正文
qsort是庫函數(shù)提供的一種排序方法,我們就簡單1了解一下怎么去用,而不去深究它的庫函數(shù)是怎么寫的
qsort是庫函數(shù)中提供的一種能排序任何類型的數(shù)據(jù)的一種排序方法,思想是quick sort(快速排序),今天我聽鵬哥講指針,剛好引入了這一點(diǎn),我就趁熱打鐵,總結(jié)一下該排序的用法
(一)void*? 的指針類型是什么?
void*類型的指針是能接受任何數(shù)據(jù)類型的地址,但是void*的指針類型是不能進(jìn)行解引用操作的,也不能進(jìn)行加減整數(shù)的操作,因?yàn)関oid*不知道它會占用多少個(gè)字節(jié)
#include <stdio.h> int main() { int a=10; char ch='w'; void* p=&a; p=&ch; return 0; }
(二)void?qsort(void*,?size_t,?size_t,?int?(?*?)(const?void?*?,??const?void?*??))? 該怎么使用該庫函數(shù)?
我們先來看看qsort()內(nèi)部有些什么參數(shù),參數(shù)類型是什么,該怎么用。
void?qsort(void* base,?size_t,?size_t,?int?(?*?)(const?void?*?,??const?void?*??))
可以看出共有四個(gè)參數(shù)
1.void1* base:待排序數(shù)組的首地址,可直接輸入待排序數(shù)組名,也可使用指針指向該數(shù)組
2.size_t num:數(shù)組的長度,假如有數(shù)組int arr[ ]用sz=sizeof(arr)/sizeof(arr[0])來計(jì)算數(shù)組的長度
3.size_t width:數(shù)組中的元素所占字節(jié),可用sizeof(arr[0])來計(jì)算單個(gè)元素的字節(jié)數(shù)
4.
int (*cmp)(const void* e1,const void* e2) { return *(int*)e1 - *(int*)e2;//因?yàn)関oid*類型的指針不能進(jìn)行加減操作,所以先將e1,e2進(jìn)行強(qiáng)制類型轉(zhuǎn)換,轉(zhuǎn)為int*,然后對其進(jìn)行解引用 //不同的情形可以根據(jù)不同的比較方式來寫入這個(gè)函數(shù) //例如,字符串進(jìn)行比較的時(shí)候,可以引用strcmp()這個(gè)函數(shù) }
:從這個(gè)形式可看出這是一個(gè)函數(shù)指針類型的參數(shù),意味著將要調(diào)用一個(gè)函數(shù),而這個(gè)函數(shù)在庫函數(shù)中表示進(jìn)行排序的方式
這里簡單解釋一下這個(gè)函數(shù)指針的意義
int 表示返回的是一個(gè)int類型的值
cmp表示函數(shù)名,*cmp表示指向這個(gè)函數(shù)
(const void* e1,const void* e2)這里·的e1,e2表示將要進(jìn)行比較的兩個(gè)元素,然后將兩個(gè)元素的地址傳到函數(shù)里,const表示無法修改指針指向的值
(三)使用qsort()來排序不同類型的數(shù)據(jù)
1.整型
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int cmp_int(const void* e1, const void* e2) { return *(int*)e1 - *(int*)e2; } int main() { int arr[10] = { 3,4,1,2,7,8,9,5,6,0 }; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr, sz, sizeof(arr[0]), cmp_int); int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
2.浮點(diǎn)型
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int cmp_float(const void* e1, const void* e2) { return (int)(*(int*)e1 - *(int*)e2); } int main() { float arr[6] = { 2.0,2.3,4.5,5.0,8.0,9.0 }; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr, sz, sizeof(arr[0]), cmp_float); int i = 0; for (i = 0; i < sz; i++) { printf("%.2f ", arr[i]); } return 0; }
3.結(jié)構(gòu)體數(shù)據(jù)類型(數(shù)字,字符串)
下面我創(chuàng)建了一個(gè)機(jī)構(gòu)體,我先以結(jié)構(gòu)體中年齡排序
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> struct stu { char name[20]; int age; char sex[10]; }; int cmp_stu_by_age(const void* e1, const void* e2)//按年齡排序 { return ((struct stu*)e1)->age- ((struct stu*)e2)->age; } int main() { struct stu s[3] = { {"zhangsan",30,"man"},{"lisi",20,"man"},{"ruhua",18,"woman"}}; int sz = sizeof(s) / sizeof(s[0]); qsort(s, sz, sizeof(s[0]), cmp_stu_by_age); int i; for (i = 0; i < sz; i++) { printf("%s %d %s\n", s[i].name, s[i].age, s[i].sex); } return 0; }
?然后以姓名排序
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> struct stu { char name[20]; int age; char sex[10]; }; int cmp_stu_by_name(const void* e1, const void* e2) { return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name); } //int cmp_stu_by_age(const void* e1, const void* e2) //{ // return ((struct stu*)e1)->age- ((struct stu*)e2)->age; //} int main() { struct stu s[3] = { {"zhangsan",30,"man"},{"lisi",20,"man"},{"ruhua",18,"woman"}}; int sz = sizeof(s) / sizeof(s[0]); qsort(s, sz, sizeof(s[0]), cmp_stu_by_name); int i; for (i = 0; i < sz; i++) { printf("%s %d %s\n", s[i].name, s[i].age, s[i].sex); } return 0; }
?總結(jié):
今天的qsort就這樣了,關(guān)鍵在于
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}這一部分的書寫與理解,然后就是孰能生巧,多練習(xí)就會知道怎么用了
原文鏈接:https://blog.csdn.net/m0_62534424/article/details/122105798
相關(guān)推薦
- 2022-10-15 QT實(shí)現(xiàn)文件傳輸功能_C 語言
- 2022-04-09 一起來學(xué)習(xí)一下python的數(shù)據(jù)類型_python
- 2022-10-03 Flutter之可滾動組件子項(xiàng)緩存?KeepAlive詳解_Android
- 2022-05-31 如何利用python給微信公眾號發(fā)消息實(shí)例代碼_python
- 2021-12-09 C語言求兩個(gè)正整數(shù)的最大公約數(shù)示例代碼_C 語言
- 2022-06-14 Flutter網(wǎng)絡(luò)請求Dio庫的使用及封裝詳解_Android
- 2023-12-23 React環(huán)境安裝配置
- 2023-07-16 uniapp 中 uni.navigateTo跳轉(zhuǎn)其他頁面 并且?guī)?shù)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支