網站首頁 編程語言 正文
鋪墊知識
qsort函數
參數類型?? ?
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
參數類型解釋
- 參數1 待排序數組首元素的地址
- 參數2 數組內元素個數
- 參數3 數組內每個元素大小,單位是字節
- 參數4 函數指針,由自己實現,內容是兩個元素的比較方法
void*?
參數1和參數4中的void*無類型的指針,能夠接受各種類型的參數,這樣的話,我們就能傳各種類型的參數
void*的注意事項?? ?
由于void是無類型指針,所以
1、void類型指針不能進行加減整數的操作(不知道步長)
2、不能進行解引用操作,
3、想要進行這些操作,需要把void類型強制類型轉成所需要的類型才能操作,例如(int*)e1,就將void*類型的e1轉換為int*
使用qsort函數進行整型數組的排序
在自己完成的in_cmp函數中,給出的是兩個元素的比較方法
- 正序排序時,e1>e2,返回大于0的數,e1==e2,返回0,e1<e2,返回小于0的數
- 逆序排序時,e1>e2,返回小于0的數,e1==e2,返回0,e1<e2,返回大于0的數
當然,我們可以用強制類型轉換后,就知道了步長,使用減法來比較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函數進行浮點型數組的排序
#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函數進行結構體數組的排序
以學生信息結構體為例,結構體包括學生名字和學生年齡
以名字為基準進行比較
#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);
}
}
原文鏈接:https://blog.csdn.net/m0_73222051/article/details/128390758
相關推薦
- 2023-05-20 linux?shell輸出換行簡單實例_linux shell
- 2022-04-23 C語言實現字符串轉浮點函數的示例_C 語言
- 2023-01-26 Android?源碼淺析RecyclerView?Adapter_Android
- 2022-09-17 利用Python實現快速批量轉換HEIC文件_python
- 2022-07-04 Android實現簡單動態搜索功能_Android
- 2023-02-06 python常見讀取語音的3種方法速度對比_python
- 2022-12-07 深入了解Rust中函數與閉包的使用_Rust語言
- 2022-12-07 C語言中的數據整除判斷問題_C 語言
- 最近更新
-
- 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同步修改后的遠程分支