網站首頁 編程語言 正文
這是基于qsort()函數進行的簡單排序。(附帶其他類型的數組使用qsort()進行的排序)
前言
基于qsort()函數進行的排序最有用的莫過于在此對于結構體數組進行排序了。此外,若能結合函數指針,更是能夠實現“想降就降,想升就升”的美好局面。
一、qsort()函數
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );(來源msdn)
base:傳過去的數組
num:數組中元素的個數
width:數組中每個元素有多大
compare():此函數指針是需要自己實現的、根據什么規則進行的排序函數
二、compare()函數
須根據需要對于參數進行指針類型的轉化。
若對字符型數組進行排序,那就轉換成字符型指針。(char*)
若對整型數組進行排序,那就轉換成整型指針。(int*)
若對浮點型數組進行排序,那就轉換成浮點型指針。(float*)
若對結構體數組的某項進行排序,那就轉換成結構體指針。(struct xxx*)
1.結構體數組
返回的是兩個結構體指針解引用后相比較的結果。
1)升序實現
代碼如下(示例):
int Ascend(const void* p1, const void* p2) { const stu* x = p1; const stu* y = p2; // 對于結構體進行二級排序: // 如果年齡相等,誰成績高誰在前面 if (x->age == y->age) { return (x->score < y->score); } else { return (x->age < y->age); } }
2)降序實現
代碼如下(示例):
int Descend(const void* p1, const void* p2) { const stu* x = p1; const stu* y = p2; // 對于結構體進行二級排序: // 如果年齡相等,誰成績高誰在前面 if (x->age == y->age) { return (x->score < y->score); } else { return (x->age < y->age); } }
2.整型數組
返回的是兩個int指針解引用后相減的結果。(用三目運算符+大于小于號也可以)
為什么不直接返回a>b(a<b)?
如下圖:因為qsort()在判斷時是需要判斷兩個參數誰大誰小,是需要一個正數或者負數的,但是直接返回a>b(a<b)的話,這個表達式的值只有0和非0,非0會被認為是相等,從而不進行交換。
1)升序實現
代碼如下(示例):
void ArrComp(const void* p1, const void* p2) { const int* x = p1; const int* y = p2; return *x - *y; }
2)降序實現
代碼如下(示例):
void ArrDescend(const void* p1, const void* p2) { const int* x = p1; const int* y = p2; return *y - *x; }
3.浮點型數組
返回的是兩個float指針解引用相減的結果,使用三目運算符進行判斷(目的是為了判斷大小后有個正負)。
1)升序實現
代碼如下(示例):
void FloatArrAscend(const void* p1, const void* p2) { const float* x = p1; const float* y = p2; return *x > *y ? 1 : -1; }
2)降序實現
代碼如下(示例):
void FloatArrDescend(const void* p1, const void* p2) { const float* x = p1; const float* y = p2; return *y < *x ? 1 : -1; }
三、效果圖
總結
qsort()函數源碼在c庫中使用的是快排進行的排序函數,結合函數指針,可以實現快速地升、降序的排序。
原文鏈接:https://blog.csdn.net/leadera_/article/details/128823814
相關推薦
- 2022-06-10 Linux環境下部署Consul集群_Linux
- 2022-10-01 Python?Color類與文字繪制零基礎掌握_python
- 2022-12-07 Golang源碼分析之golang/sync之singleflight_Golang
- 2022-11-10 詳解?PyTorch?Lightning模型部署到生產服務中_python
- 2022-04-15 c語言?指針零基礎講解_C 語言
- 2022-05-25 Starship定制shell提示符實現信息自由_python
- 2022-06-15 python中?conda?虛擬環境管理和jupyter內核管理_python
- 2022-09-07 Python利用Seaborn繪制多標簽的混淆矩陣_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支