前言
?? ??hello! 各位寶子們大家好啊,剛開始學(xué)編程的時候我們都是用冒泡來進行排序的,今天給大家介紹一下新的排序方法庫函數(shù)qsort!
?? ??sor英文原意是排序的意思,而qsort的q是quick的縮寫快速的意思!那么庫函數(shù)qsort的意思就不言而喻了吧?快速排序!
?? ??本期文章收錄在《C語言初階篇》 ,大家有興趣可以看看吶!
???? 歡迎鐵汁們 ?? 點贊 ?? 收藏 ?留言 ??!
?? 庫函數(shù)qsort的介紹
????在介紹庫函數(shù)qsort之前我們先來回顧下冒泡排序。
- ?? 有一組整數(shù)數(shù)據(jù)要排為升序,該怎么做?
- ?? 用倆倆相鄰的元素進行比較
- ?? 如果不滿足就進行交換,這是冒泡排序的核心思想!
- ?? 我們來用代碼寫一下看看。
?? 代碼演示:
#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ù),像浮點數(shù)、字符、結(jié)構(gòu)體都排序不了!
???? 而我們的庫函數(shù)qsort就不一樣了,所有數(shù)據(jù)類型都可以排序這點是不是比冒泡排序強太多了?我們先來看看在C語言官網(wǎng)上qsort的描述。
? 大部分人肯看到這個參數(shù)可能就會想怎么這么復(fù)雜?其實沒有什么難的我們來一起看一下慢慢來你就會徹底明白這些是什么意思?
- 信息一: 在使用qsort之前得先引用他的頭文件<stdlib.h>
- 信息二: 它需要接收4個參數(shù)
- 信息三: 這個庫函數(shù)沒有返回值+++
這就就是我們暫時獲得的信息,而我們知道要調(diào)用函數(shù)得給它傳值那么接下來,就來研究一下啊,qsort函數(shù)的參數(shù)
?? 庫函數(shù)qsort的參數(shù)介紹
上面是C語言官網(wǎng)上對qsort的四個參數(shù)描述,看起來很復(fù)雜是吧其實非常簡單我們來把函數(shù)原型寫出來對照一下,看下每個參數(shù)的含義是什么:
void qsort(void* base, //指向了需要排序的數(shù)組的第一個元素
size_t num, //排序的元素個數(shù)
size_t size,//一個元素的大小,單位是字節(jié)
int (*cmp)(const void*, const void*)
//函數(shù)指針類型 - 這個函數(shù)指針指向的函數(shù),能夠比較base指向數(shù)組中的兩個元素
);
?? 參數(shù)一 (void* base)
?? 看下一下官方文檔中的參數(shù)描述:
- v o i d ? b a s e void* base void?base 是什么意思:
![]()
?? 這里說指向要排序的的第一對象的指針轉(zhuǎn)為, void* 空指針類型
- 其實意思就是我們需要給他傳一個
- 指向要排序的對象的第一個元素的指針
- 它會自動轉(zhuǎn)換為空指針類型
?? 參數(shù)二 (size_t num)
?? 看下一下官方文檔中的參數(shù)描述:
- size_t num 是什么意思:
![]()
?? 這里意思是:base指向的數(shù)組空間里元素的個數(shù), size_t 是一個無符號整形的數(shù)!
- 其實意思就是我們需要給他傳一個
- base指向數(shù)組空間里元素的個數(shù)
- 它會自動轉(zhuǎn)換為一個無符號整形
?? 注:我們知道無符號整數(shù)沒有符號位,所以它永遠(yuǎn)表示的都是正數(shù)。而元素個數(shù)也都是正數(shù)不能是負(fù)數(shù)所以這里會轉(zhuǎn)換為size_t類型。
?? 參數(shù)三 (size_t size)
?? 看下一下官方文檔中的參數(shù)描述:
- size_t size 是什么意思:
![]()
?? 這里意思是:base指向的數(shù)組里每元素的大小, size_t 是一個無符號整形的數(shù)!
- 其實意思就是我們需要給他傳一個
- base指向的數(shù)組里每元素的類型大小,是多少字節(jié)!
- 它會自動轉(zhuǎn)換為一個無符號整形
?? 注:和前面一樣,數(shù)據(jù)類型的大小也永遠(yuǎn)是正數(shù),所以我們把它轉(zhuǎn)換為size_t類型是不是合適些!
?? 參數(shù)四 (int (cmp)(const void, const void*))
?? 看下一下官方文檔中的參數(shù)描述:
- (int (cmp)(const void, const void*) 是什么意思:
![]()
?? 這里意思是:參數(shù)四需要一個函數(shù)指針類型的參數(shù),做為比較函數(shù)傳給它!
也就是我們需要自己寫一個比較函數(shù)然后把地址傳給參數(shù)四
int compar (const void* p1, const void* p2);
- 需要的參數(shù)是Zvoid* 的類型的大家想
- 是不是這樣就可以接收所有的數(shù)據(jù)類型了
這個函數(shù)需要完成的功能是
- 指針變量p1 和 指針變量p2 比較。
- 如果p1<p2就返回小于0的數(shù)
- 如果p1= p2就返回0
- 如果p1>p2就返回大于0的數(shù)
??(void *)指針講解
void我們都知道是一個空類型的意思,void 就是無類型的指針 :*
- 無具體類型的指針,可以說他為通用類型指針
- 但是這種類型的指針是不能夠直接進行解引用操作的
- 由于類型是空類型所以也不能進行指針運算
- 因為既然他是個空類型那么我們
+ -
是該跳過多少字節(jié)呢?
??示例一:
????這里就就可以看出一旦指針類型不同是不可以接收不同類型的地址的!
- 而用
void*
類型的指針就不會出現(xiàn)這種情況
??示例二:
?? (void* )類型的指針該如何使用
????前面說了這種指針既不能直接解引用,又不能進行指針運算那么我們該怎么使用void*類型的指針呢?
- ?? 其實void*類型的指針在使用的時候需要強制轉(zhuǎn)換一下就好了!
- ?? 這樣這個空指針類型不就有類型了(我們強制轉(zhuǎn)換的類型)
- ?? 那么指針的運算不也解決了?因為有類型了就可以知道
- ?? 加一步我們可以跳過多少字節(jié)
??圖片展示:
?? qsort應(yīng)用實例
?? qsort應(yīng)用實例排序整形
????好了各位寶子們!前面的知識我們掌握就可以來實踐一下這個庫函數(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;
}
這里我們就進行了整形數(shù)組排序,前三個參數(shù)很簡單就不講:
- 第四個參數(shù)我們說了,需要一個比較函數(shù)的地址傳給他
- 而函數(shù)名就是地址,也可以寫取地址&加函數(shù)名
那么我們就造一個比較函數(shù)出來就行
- 整形剛好用一個數(shù)減另一個整形
- 如果大于0第一個數(shù)就大些
- 小于0就說明第一個參數(shù)小些
- 剛好滿足要求!
?? 代碼結(jié)果:
?? qsort應(yīng)用實例排序字符
????同理字符前面三個參數(shù)也一樣就比較函數(shù)需要改動,而字符的比較直接用strcmp這個函數(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)用實例排序結(jié)構(gòu)體
????同理字符前面三個參數(shù)也一樣就比較函數(shù)需要改動,而字符的比較直接用strcmp這個函數(shù)就可以了!
- 這里幾不給大家打印出來看了,給大家看一下監(jiān)視就可以看出來是否排序了
?? 代碼演示:
#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é)果:文章來源:http://www.zghlxwxcb.cn/news/detail-625784.html
總結(jié)
? 歸納:
好了以上就是關(guān)于 庫函數(shù) qsort 快速排序函數(shù) 的用法就全部講解完畢啦!
??庫函數(shù) qsort的介紹
??庫函數(shù) qsort 參數(shù)一
??庫函數(shù) qsort 參數(shù)二
??庫函數(shù) qsort參數(shù)三
??庫函數(shù) qsort參數(shù)四
??庫函數(shù) qsort的應(yīng)用
?? 把本章的內(nèi)容全部掌握,鐵汁們就可以熟練應(yīng)用qsort排序各種各樣的數(shù)據(jù)啦!
看到這里了還不給博主扣個:
?? 點贊
??收藏
?? 關(guān)注
!
?? ?? ?? ?? ???? ?? ?? ?? ?? ??
拜托拜托這個真的很重要!
你們的點贊就是博主更新最大的動力!
有問題可以評論或者私信呢秒回哦。文章來源地址http://www.zghlxwxcb.cn/news/detail-625784.html
到了這里,關(guān)于還在使用冒泡排序遍歷數(shù)組?No No No 庫函數(shù)qsort幫你搞定所有排序還不快學(xué)起來!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!