前言
?? ??hello! 各位寶子們大家好啊,剛開(kāi)始學(xué)編程的時(shí)候我們都是用冒泡來(lái)進(jìn)行排序的,今天給大家介紹一下新的排序方法庫(kù)函數(shù)qsort!
?? ??sor英文原意是排序的意思,而qsort的q是quick的縮寫(xiě)快速的意思!那么庫(kù)函數(shù)qsort的意思就不言而喻了吧?快速排序!
?? ??本期文章收錄在《C語(yǔ)言初階篇》 ,大家有興趣可以看看吶!
???? 歡迎鐵汁們 ?? 點(diǎn)贊 ?? 收藏 ?留言 ??!
?? 庫(kù)函數(shù)qsort的介紹
????在介紹庫(kù)函數(shù)qsort之前我們先來(lái)回顧下冒泡排序。
- ?? 有一組整數(shù)數(shù)據(jù)要排為升序,該怎么做?
- ?? 用倆倆相鄰的元素進(jìn)行比較
- ?? 如果不滿足就進(jìn)行交換,這是冒泡排序的核心思想!
- ?? 我們來(lái)用代碼寫(xiě)一下看看。
?? 代碼演示:
#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
int i = 0;
//趟數(shù)
for (i = 0; i < sz - 1; i++)
{
//一趟比較
//兩兩相鄰元素比較
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
?? 但是:冒泡排序只能排序整數(shù),像浮點(diǎn)數(shù)、字符、結(jié)構(gòu)體都排序不了!
???? 而我們的庫(kù)函數(shù)qsort就不一樣了,所有數(shù)據(jù)類型都可以排序這點(diǎn)是不是比冒泡排序強(qiáng)太多了?我們先來(lái)看看在C語(yǔ)言官網(wǎng)上qsort的描述。
? 大部分人肯看到這個(gè)參數(shù)可能就會(huì)想怎么這么復(fù)雜?其實(shí)沒(méi)有什么難的我們來(lái)一起看一下慢慢來(lái)你就會(huì)徹底明白這些是什么意思?
- 信息一: 在使用qsort之前得先引用他的頭文件<stdlib.h>
- 信息二: 它需要接收4個(gè)參數(shù)
- 信息三: 這個(gè)庫(kù)函數(shù)沒(méi)有返回值+++
這就就是我們暫時(shí)獲得的信息,而我們知道要調(diào)用函數(shù)得給它傳值那么接下來(lái),就來(lái)研究一下啊,qsort函數(shù)的參數(shù)
?? 庫(kù)函數(shù)qsort的參數(shù)介紹
上面是C語(yǔ)言官網(wǎng)上對(duì)qsort的四個(gè)參數(shù)描述,看起來(lái)很復(fù)雜是吧其實(shí)非常簡(jiǎn)單我們來(lái)把函數(shù)原型寫(xiě)出來(lái)對(duì)照一下,看下每個(gè)參數(shù)的含義是什么:
void qsort(void* base, //指向了需要排序的數(shù)組的第一個(gè)元素
size_t num, //排序的元素個(gè)數(shù)
size_t size,//一個(gè)元素的大小,單位是字節(jié)
int (*cmp)(const void*, const void*)
//函數(shù)指針類型 - 這個(gè)函數(shù)指針指向的函數(shù),能夠比較base指向數(shù)組中的兩個(gè)元素
);
?? 參數(shù)一 (void* base)
?? 看下一下官方文檔中的參數(shù)描述:
- v o i d ? b a s e void* base void?base 是什么意思:
![]()
?? 這里說(shuō)指向要排序的的第一對(duì)象的指針轉(zhuǎn)為, void* 空指針類型
- 其實(shí)意思就是我們需要給他傳一個(gè)
- 指向要排序的對(duì)象的第一個(gè)元素的指針
- 它會(huì)自動(dòng)轉(zhuǎn)換為空指針類型
?? 參數(shù)二 (size_t num)
?? 看下一下官方文檔中的參數(shù)描述:
- size_t num 是什么意思:
![]()
?? 這里意思是:base指向的數(shù)組空間里元素的個(gè)數(shù), size_t 是一個(gè)無(wú)符號(hào)整形的數(shù)!
- 其實(shí)意思就是我們需要給他傳一個(gè)
- base指向數(shù)組空間里元素的個(gè)數(shù)
- 它會(huì)自動(dòng)轉(zhuǎn)換為一個(gè)無(wú)符號(hào)整形
?? 注:我們知道無(wú)符號(hào)整數(shù)沒(méi)有符號(hào)位,所以它永遠(yuǎn)表示的都是正數(shù)。而元素個(gè)數(shù)也都是正數(shù)不能是負(fù)數(shù)所以這里會(huì)轉(zhuǎn)換為size_t類型。
?? 參數(shù)三 (size_t size)
?? 看下一下官方文檔中的參數(shù)描述:
- size_t size 是什么意思:
![]()
?? 這里意思是:base指向的數(shù)組里每元素的大小, size_t 是一個(gè)無(wú)符號(hào)整形的數(shù)!
- 其實(shí)意思就是我們需要給他傳一個(gè)
- base指向的數(shù)組里每元素的類型大小,是多少字節(jié)!
- 它會(huì)自動(dòng)轉(zhuǎn)換為一個(gè)無(wú)符號(hào)整形
?? 注:和前面一樣,數(shù)據(jù)類型的大小也永遠(yuǎn)是正數(shù),所以我們把它轉(zhuǎn)換為size_t類型是不是合適些!
?? 參數(shù)四 (int (cmp)(const void, const void*))
?? 看下一下官方文檔中的參數(shù)描述:
- (int (cmp)(const void, const void*) 是什么意思:
![]()
?? 這里意思是:參數(shù)四需要一個(gè)函數(shù)指針類型的參數(shù),做為比較函數(shù)傳給它!
也就是我們需要自己寫(xiě)一個(gè)比較函數(shù)然后把地址傳給參數(shù)四
int compar (const void* p1, const void* p2);
- 需要的參數(shù)是Zvoid* 的類型的大家想
- 是不是這樣就可以接收所有的數(shù)據(jù)類型了
這個(gè)函數(shù)需要完成的功能是
- 指針變量p1 和 指針變量p2 比較。
- 如果p1<p2就返回小于0的數(shù)
- 如果p1= p2就返回0
- 如果p1>p2就返回大于0的數(shù)
??(void *)指針講解
void我們都知道是一個(gè)空類型的意思,void 就是無(wú)類型的指針 :*
- 無(wú)具體類型的指針,可以說(shuō)他為通用類型指針
- 但是這種類型的指針是不能夠直接進(jìn)行解引用操作的
- 由于類型是空類型所以也不能進(jìn)行指針運(yùn)算
- 因?yàn)榧热凰莻€(gè)空類型那么我們
+ -
是該跳過(guò)多少字節(jié)呢?
??示例一:
????這里就就可以看出一旦指針類型不同是不可以接收不同類型的地址的!
- 而用
void*
類型的指針就不會(huì)出現(xiàn)這種情況
??示例二:
?? (void* )類型的指針該如何使用
????前面說(shuō)了這種指針既不能直接解引用,又不能進(jìn)行指針運(yùn)算那么我們?cè)撛趺词褂胿oid*類型的指針呢?
- ?? 其實(shí)void*類型的指針在使用的時(shí)候需要強(qiáng)制轉(zhuǎn)換一下就好了!
- ?? 這樣這個(gè)空指針類型不就有類型了(我們強(qiáng)制轉(zhuǎn)換的類型)
- ?? 那么指針的運(yùn)算不也解決了?因?yàn)橛蓄愋土司涂梢灾?/li>
- ?? 加一步我們可以跳過(guò)多少字節(jié)
??圖片展示:
?? qsort應(yīng)用實(shí)例
?? qsort應(yīng)用實(shí)例排序整形
????好了各位寶子們!前面的知識(shí)我們掌握就可以來(lái)實(shí)踐一下這個(gè)庫(kù)函數(shù)是不是真的有那么神奇,相信很多人已經(jīng)迫不及待了吧!
?? 代碼演示:
#include <stdio.h>
#include <stdlib.h>
int compar(const void* p1,const void* p2)
{
return (*((int*)p1) - *((int*)p2));
}
void print(int* arr, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 8,6,9,7,6,1,2,4,5,3,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
//排序
qsort(arr, sz, sizeof(arr[0]), compar);
//打印
print(arr, sz);
return 0;
}
這里我們就進(jìn)行了整形數(shù)組排序,前三個(gè)參數(shù)很簡(jiǎn)單就不講:
- 第四個(gè)參數(shù)我們說(shuō)了,需要一個(gè)比較函數(shù)的地址傳給他
- 而函數(shù)名就是地址,也可以寫(xiě)取地址&加函數(shù)名
那么我們就造一個(gè)比較函數(shù)出來(lái)就行
- 整形剛好用一個(gè)數(shù)減另一個(gè)整形
- 如果大于0第一個(gè)數(shù)就大些
- 小于0就說(shuō)明第一個(gè)參數(shù)小些
- 剛好滿足要求!
?? 代碼結(jié)果:
?? qsort應(yīng)用實(shí)例排序字符
????同理字符前面三個(gè)參數(shù)也一樣就比較函數(shù)需要改動(dòng),而字符的比較直接用strcmp這個(gè)函數(shù)就可以了!
?? 代碼演示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compar(const void* p1,const void* p2)
{
return strcmp((char*)p1,(char*)p2);
}
void print(char* arr, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%c ", arr[i]);
}
}
int main()
{
char arr[] = { 'c','a','f','d','B','A','C','D'};
int sz = sizeof(arr) / sizeof(arr[0]);
//排序
qsort(arr, sz, sizeof(arr[0]), compar);
//打印
print(arr, sz);
return 0;
}
?? 代碼結(jié)果:
?? qsort應(yīng)用實(shí)例排序結(jié)構(gòu)體
????同理字符前面三個(gè)參數(shù)也一樣就比較函數(shù)需要改動(dòng),而字符的比較直接用strcmp這個(gè)函數(shù)就可以了!
- 這里幾不給大家打印出來(lái)看了,給大家看一下監(jiān)視就可以看出來(lái)是否排序了
?? 代碼演示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Stu
{
char arr[20];
int age;
};
int compar_by_age(const void* p1,const void* p2)
{
return (((struct Stu*)p1)->age-((struct Stu*)p2)->age);
}
int main()
{
struct Stu arr[] = { {"zhangsan",30},{"lisi",70},{"wangwu",10} };
int sz = sizeof(arr) / sizeof(arr[0]);
//排序
qsort(arr, sz, sizeof(arr[0]), compar_by_age);
return 0;
}
?? 代碼結(jié)果:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-628838.html
總結(jié)
? 歸納:
好了以上就是關(guān)于 庫(kù)函數(shù) qsort 快速排序函數(shù) 的用法就全部講解完畢啦!
??庫(kù)函數(shù) qsort的介紹
??庫(kù)函數(shù) qsort 參數(shù)一
??庫(kù)函數(shù) qsort 參數(shù)二
??庫(kù)函數(shù) qsort參數(shù)三
??庫(kù)函數(shù) qsort參數(shù)四
??庫(kù)函數(shù) qsort的應(yīng)用
?? 把本章的內(nèi)容全部掌握,鐵汁們就可以熟練應(yīng)用qsort排序各種各樣的數(shù)據(jù)啦!
看到這里了還不給博主扣個(gè):
?? 點(diǎn)贊
??收藏
?? 關(guān)注
!
?? ?? ?? ?? ???? ?? ?? ?? ?? ??
拜托拜托這個(gè)真的很重要!
你們的點(diǎn)贊就是博主更新最大的動(dòng)力!
有問(wèn)題可以評(píng)論或者私信呢秒回哦。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-628838.html
到了這里,關(guān)于【C語(yǔ)言進(jìn)階篇】快排函數(shù) qsort 詳細(xì)解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!