目錄
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-832428.html
1、qsort函數(shù)是什么
2、冒泡排序?qū)崿F(xiàn)指針進(jìn)階
2.1 主函數(shù)
2.2 功能函數(shù)聲明?編輯
2.3 my_qsort函數(shù)介紹
2.4 Swap函數(shù)
總結(jié)
?
1、qsort函數(shù)是什么
? ? ? ? qsort函數(shù)是c語(yǔ)言自帶的函數(shù),其功能是實(shí)現(xiàn)快速排序。我們來(lái)看一下他的參數(shù)和返回值:
? ? ? ? 以上就是qsort的參數(shù)和返回值,可以看到,其返回值是void也就是沒(méi)有返回值;而參數(shù)方面,包括:void* base 這是要排序的數(shù)據(jù)的起始位置的指針、 size_t num 待排序的數(shù)據(jù)元素個(gè)數(shù)、 size_y width 待排序數(shù)據(jù)元素的大?。▎挝皇亲止?jié))、 int(* cmp)(const void* e1,const void* e2) 函數(shù)指針變量,其指向一個(gè)返回值為int類型,參數(shù)為兩個(gè)void*的指針e1和e2,他們分別指向要排序數(shù)據(jù)的第一個(gè)元素和第二個(gè)元素。
? ? ? ? 看一個(gè)用qsort實(shí)現(xiàn)的排序:
? ? ? ? 我們需要自己定義一個(gè)cmp函數(shù),里面設(shè)計(jì)一個(gè)比較函數(shù),e1 和 e2 指向數(shù)據(jù)的前兩個(gè)元素,如果設(shè)計(jì)為:*e1大于*e2時(shí)返回正值;*e1等于*e2時(shí)返回0;*e1小于*e2時(shí)返回負(fù)值時(shí),qsort就會(huì)實(shí)現(xiàn)對(duì)數(shù)據(jù)的升序排列,反之,qsort就會(huì)實(shí)現(xiàn)降序排列。因此,我們發(fā)現(xiàn),qsort實(shí)現(xiàn)的功能其實(shí)取決于我們?nèi)绾稳ピO(shè)計(jì)cmp函數(shù)。此外,qsort可以比較不僅限于整型數(shù)據(jù)的大小,還可以比較字符串等等各種類型的大小,其規(guī)則和整型相同,都是取決于如何去設(shè)計(jì)cmp函數(shù)。
? ? ? ? 好了,講到這我們大致了解了qsort函數(shù),現(xiàn)在,我們將用冒泡排序去實(shí)現(xiàn)qsort的功能。這樣的練習(xí)有助于我們更好地了解和運(yùn)用指針,實(shí)現(xiàn)我們對(duì)c語(yǔ)言的進(jìn)階。
2、冒泡排序?qū)崿F(xiàn)快速排序
? ? ? ? 先看看最終代碼:
#include <stdio.h>
void my_qsort(void* base, int num, int width, int (*cmp)(const void* e1, const void* e2));
void Swap(char* e1, char* e2, int width);
int cmp(const void* e1, const void* e2);
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
my_qsort(arr,sz,sizeof(int),cmp);
int i = 0;
for (i = 0;i < sz;i++)
{
printf("%d ", arr[i]);
}
return 0;
}
void my_qsort(void* base, int num, int width, int (*cmp)(const void* e1, const void* e2))
{
int i = 0;
for (i = 0;i <num-1;i++)
{
int flag = 1;
int j = 0;
for (j = 0;j < num - 1 - i;j++)
{
if (cmp((char*)base + width * j, (char*)base + width * (j + 1)) < 0)
{
//交換
Swap((char*)base + width * j, (char*)base + width * (j + 1),width);
}
}
}
}
void Swap(char* e1, char* e2, int width)
{
int i = 0;
int c = 0;
for (i = 0;i < width;i++)
{
c = *(e1 + i);
*(e1 + i) = *(e2 + i);
*(e2 + i) = c;
}
}
int cmp(const void* e1, const void* e2)
{
return *((int*)e1) - *((int*)e2);
}
效果:
可見(jiàn)確實(shí)模擬出了qsort的效果。
一步步分析:
2.1 主函數(shù)
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
my_qsort(arr,sz,sizeof(int),cmp);
int i = 0;
for (i = 0;i < sz;i++)
{
printf("%d ", arr[i]);
}
return 0;
}
? ? ? ? 主函數(shù)主要是arr數(shù)組的定義,求其長(zhǎng)度sz,引用my_qsort函數(shù)和打印排序后的函數(shù)。沒(méi)有需要重點(diǎn)講的。
? ? ? ? 接下來(lái)介紹所運(yùn)用到的功能函數(shù):
2.2 功能函數(shù)聲明
????????這里包括了三個(gè)函數(shù),my_qsort就是用冒泡排序模擬實(shí)現(xiàn)qsort的函數(shù),Swap函數(shù)是用來(lái)交換e1和e2的函數(shù),cmp就是正常qsort中我們需要自己設(shè)定的函數(shù),可以通過(guò)改變cmp的內(nèi)容實(shí)現(xiàn)不同效果的排序。其中cmp在上面已經(jīng)介紹過(guò)了所以下面我只重點(diǎn)介紹my_qsort函數(shù)和Swap函數(shù)。
2.3 my_qsort函數(shù)介紹
? ? ? ? 首先要明白,這個(gè)函數(shù)的主要思想其實(shí)是一個(gè)冒泡排序。只不過(guò)在正常冒泡排序的交換過(guò)程我們用了Swap函數(shù)代替。
? ? ? ? 重點(diǎn)來(lái)了,來(lái)看看其中這兩行的代碼:
????????這里我們將原本void類型的代碼轉(zhuǎn)化為了cahr*,這是因?yàn)?,我們模擬的qsort是一個(gè)可以對(duì)任何數(shù)據(jù)進(jìn)行排序的函數(shù),不僅限于int類型,所以,我們要想一個(gè)辦法能夠用指針去指向任意大小的數(shù)據(jù),我們考慮的就是char*類型,因?yàn)槲覀儌鲄⒌臅r(shí)候?qū)⒃氐拇笮idth傳了過(guò)來(lái),這樣,我們定義了char*類型的指針(1字節(jié)),只需要用i*width就可以指向后i個(gè)數(shù)據(jù);反之,如果不用char*類型的話,其他類型的指針步長(zhǎng)本身都不為1字節(jié),,這樣加上i無(wú)法確定指針指向了哪個(gè)數(shù)據(jù)。
? ? ? ? 下面,來(lái)講解一下Swap函數(shù):
2.4 Swap函數(shù)
? ? ? ? Swap函數(shù)實(shí)現(xiàn)的是大小為width的兩個(gè)元素的互換,由于我們指針e1和e2為char類型,所以,想要完全互換的話,需要對(duì)指針后width個(gè)內(nèi)容都進(jìn)行互換,因此我們寫了如此一個(gè)循環(huán)進(jìn)行互換。
總結(jié)
????????以上,就是用冒泡排序?qū)崿F(xiàn)qsort函數(shù)的模擬了,它不僅可以對(duì)整型數(shù)據(jù)進(jìn)行排序,還可以對(duì)任意類型數(shù)據(jù)進(jìn)行排序,其中運(yùn)用到了函數(shù)指針,也要求編程者對(duì)函數(shù)有一定深刻的理解。了解好原理,自己動(dòng)手去完成這樣一個(gè)函數(shù)模擬,我相信,你對(duì)指針的的理解會(huì)上升一個(gè)臺(tái)階。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-832428.html
?
到了這里,關(guān)于用冒泡排序?qū)崿F(xiàn)快速排序(qsort函數(shù)),指針進(jìn)階實(shí)例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!