国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語(yǔ)言-指針進(jìn)階-qsort函數(shù)的學(xué)習(xí)與模擬實(shí)現(xiàn)(9.3)

這篇具有很好參考價(jià)值的文章主要介紹了C語(yǔ)言-指針進(jìn)階-qsort函數(shù)的學(xué)習(xí)與模擬實(shí)現(xiàn)(9.3)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

思維導(dǎo)圖:

回調(diào)函數(shù)

qsort函數(shù)介紹

模擬實(shí)現(xiàn)qsort

寫(xiě)在最后:


思維導(dǎo)圖:

C語(yǔ)言-指針進(jìn)階-qsort函數(shù)的學(xué)習(xí)與模擬實(shí)現(xiàn)(9.3),C語(yǔ)言學(xué)習(xí),c語(yǔ)言,學(xué)習(xí)

回調(diào)函數(shù)

什么是回調(diào)函數(shù)?

回調(diào)函數(shù)是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。

將一個(gè)函數(shù)指針作為參數(shù)傳遞給一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用所指向函數(shù)時(shí),

我們就將此稱為回調(diào)函數(shù)。

在舉例之前,我們先學(xué)習(xí)一個(gè)C語(yǔ)言的庫(kù)函數(shù)qsort。? ? ? ??

qsort函數(shù)介紹

qsort函數(shù)是一個(gè)排序函數(shù),可以幫助我們排序。

我們?yōu)槭裁匆獙W(xué)習(xí)這樣一個(gè)函數(shù)呢?

我們對(duì)一個(gè)整形數(shù)組進(jìn)行排序:

例:

#include <stdio.h>

void print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

void bubble_sort(int arr[], int sz)
{
	int i = 0;
	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;
			}
		}
	}
}

void test()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);//冒泡排序
	print(arr, sz);//打印
}

int main()
{
	test();//分裝函數(shù)
	return 0;
}

輸出:

輸出:0 1 2 3 4 5 6 7 8 9

但是如果我們想對(duì)一個(gè)結(jié)構(gòu)體進(jìn)行排序,冒泡排序就承擔(dān)不了這個(gè)任務(wù)了,

(不止結(jié)構(gòu)體,像浮點(diǎn)數(shù)啊,字符數(shù)組啊,冒泡排序都無(wú)法工作)

這個(gè)時(shí)候,我們就能使用qsort函數(shù)幫我們排序。

我們可以通過(guò)cplusplus學(xué)習(xí)一下這個(gè)函數(shù):

C語(yǔ)言-指針進(jìn)階-qsort函數(shù)的學(xué)習(xí)與模擬實(shí)現(xiàn)(9.3),C語(yǔ)言學(xué)習(xí),c語(yǔ)言,學(xué)習(xí)

通過(guò)閱讀介紹,我們得知qsort的功能:

對(duì)數(shù)組中由指針指向的元素進(jìn)行排序,根據(jù)每個(gè)元素字節(jié)長(zhǎng)度,使用函數(shù)確定順序。

此函數(shù)使用的快速排序算法通過(guò)調(diào)用指定的函數(shù)來(lái)比較元素,并將指向它們的指針作為參數(shù)。

該函數(shù)不返回任何值,但通過(guò)重新排序數(shù)組的元素來(lái)修改指向的數(shù)組的內(nèi)容。

以及使用該函數(shù)需要傳遞的參數(shù):

int main()
{

	void qsort(void* base, size_t num, size_t size,
		int (*compar)(const void*, const void*));
	//一個(gè)指針,兩個(gè)無(wú)符號(hào)整數(shù),一個(gè)函數(shù)指針

	return 0;
}

C語(yǔ)言-指針進(jìn)階-qsort函數(shù)的學(xué)習(xí)與模擬實(shí)現(xiàn)(9.3),C語(yǔ)言學(xué)習(xí),c語(yǔ)言,學(xué)習(xí)?這個(gè)庫(kù)函數(shù)需要調(diào)用的頭文件是:<stdlib.h>

以及各個(gè)參數(shù)的不同意思:

#include <stdio.h>

int main()
{

	void qsort(void* base, 
		size_t num, 
		size_t size,
		int (*compar)(const void*, const void*));
	//void*base是指向要排序的數(shù)組的第一個(gè)對(duì)象的指針,轉(zhuǎn)換為void*類型
	//size_t num是數(shù)組中的元素?cái)?shù)
	//size_t size是數(shù)組中每個(gè)元素的大?。ㄒ宰止?jié)為單位)
	//int (*compar)(const void*, const void*))是指向比較兩個(gè)元素的函數(shù)的指針

	return 0;
}

?這樣,我們就能使用qsort函數(shù)幫助我們排序了:

例:

#include <stdio.h>
#include <stdlib.h>

struct Stu
{
	char name[20];
	int age;
};

int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
	//如果e1 > e2則返回>O的數(shù)
	//如果e1 = e2則返回0
	//如果e1 < e2則返回<0的數(shù)
}

void print(struct Stu* s, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d歲\n", (&s[i])->name,(&s[i])->age);
	}
}

void test()
{
	struct Stu s[3] = { {"張三",20}, {"李四", 50}, {"王五", 33} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);//排序
	print(s, sz);//打印函數(shù)
}

int main()
{
	test();//分裝函數(shù)
	return 0;
}

輸出:

輸出:
張三 20歲
王五 33歲
李四 50歲

利用qsort函數(shù),我們成功給結(jié)構(gòu)體排序了。

模擬實(shí)現(xiàn)qsort

在模擬實(shí)現(xiàn)qsort時(shí),我們就要用到回調(diào)函數(shù)的思想:

例:

#include <stdio.h>
#include <stdlib.h>

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
	//如果e1 > e2則返回>O的數(shù)
	//如果e1 = e2則返回0
	//如果e1 < e2則返回<0的數(shù)
}

//通過(guò)交換每個(gè)字節(jié)的形式,以達(dá)成交換兩個(gè)數(shù)的值的目的
void Swap(char* buf1, char* buf2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
                                                      //這里將cmp_int函數(shù)的指針傳參
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
{
	//趟數(shù)
	size_t i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		//一趟冒泡排序的過(guò)程
		size_t j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{       //這里運(yùn)用了回調(diào)函數(shù),在冒泡排序函數(shù)里調(diào)用cmp_int函數(shù),并判斷
			    //這里判斷函數(shù)返回的值大于零就進(jìn)入語(yǔ)句,排序后是升序數(shù)組
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{
				//交換
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}

void print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

void test()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
	print(arr, sz);//打印函數(shù)
}

int main()
{
	test();//分裝函數(shù)
	return 0;
}

輸出:

輸出:0 1 2 3 4 5 6 7 8 9

再用它來(lái)排序一下結(jié)構(gòu)體數(shù)組也是可以的:

例:

#include <stdio.h>
#include <stdlib.h>

struct Stu
{
	char name[20];
	int age;
};

int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
	//如果e1 > e2則返回>O的數(shù)
	//如果e1 = e2則返回0
	//如果e1 < e2則返回<0的數(shù)
}

//通過(guò)交換每個(gè)字節(jié)的形式,以達(dá)成交換兩個(gè)數(shù)的值的目的
void Swap(char* buf1, char* buf2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
                                                      //這里將cmp_int函數(shù)的指針傳參
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
{
	//趟數(shù)
	size_t i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		//一趟冒泡排序的過(guò)程
		size_t j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{       //這里運(yùn)用了回調(diào)函數(shù),在冒泡排序函數(shù)里調(diào)用cmp_int函數(shù),并判斷
			    //這里判斷函數(shù)返回的值大于零就進(jìn)入語(yǔ)句,排序后是升序數(shù)組
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{
				//交換
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}

void print(struct Stu* s, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d歲\n", (&s[i])->name,(&s[i])->age);
	}
}

void test()
{
	struct Stu s[3] = { {"張三",20}, {"李四", 50}, {"王五", 33} };
	int sz = sizeof(s) / sizeof(s[0]);
	bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_age);
	print(s, sz);//打印函數(shù)
}

int main()
{
	test();//分裝函數(shù)
	return 0;
}

輸出:

輸出:
張三 20歲
王五 33歲
李四 50歲

寫(xiě)在最后:

以上就是本篇文章的內(nèi)容了,感謝你的閱讀。

如果喜歡本文的話,歡迎點(diǎn)贊和評(píng)論,寫(xiě)下你的見(jiàn)解。

如果想和我一起學(xué)習(xí)編程,不妨點(diǎn)個(gè)關(guān)注,我們一起學(xué)習(xí),一同成長(zhǎng)。

之后我還會(huì)輸出更多高質(zhì)量?jī)?nèi)容,歡迎收看。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-616051.html

到了這里,關(guān)于C語(yǔ)言-指針進(jìn)階-qsort函數(shù)的學(xué)習(xí)與模擬實(shí)現(xiàn)(9.3)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C語(yǔ)言】輕松模擬實(shí)現(xiàn)qsort函數(shù)

    【C語(yǔ)言】輕松模擬實(shí)現(xiàn)qsort函數(shù)

    君兮_的個(gè)人主頁(yè) 勤時(shí)當(dāng)勉勵(lì) 歲月不待人 C/C++ 游戲開(kāi)發(fā) Hello,米娜桑們,這里是君兮_,我們今天接著上回更新的內(nèi)容,講講我們?nèi)绾文M實(shí)現(xiàn)自己的qsort函數(shù), 廢話不多說(shuō),我們開(kāi)始今天的內(nèi)容。 關(guān)于這方面的內(nèi)容已經(jīng)在上篇博客中具體介紹了,這里不再綴敘,感興趣的話可

    2024年02月16日
    瀏覽(18)
  • 【C語(yǔ)言】回調(diào)函數(shù)(qsort)與模擬實(shí)現(xiàn)

    【C語(yǔ)言】回調(diào)函數(shù)(qsort)與模擬實(shí)現(xiàn)

    何思何慮,居心當(dāng)如止水;勿取勿忘,為學(xué)當(dāng)如流水。— 出自《格言聯(lián)璧·學(xué)問(wèn)類》 解釋:無(wú)思無(wú)慮,心境應(yīng)當(dāng)平靜如水;不求冒進(jìn)也不忘記,學(xué)業(yè)當(dāng)如流水一般永無(wú)止境。 這篇博客我們將會(huì)理解回調(diào)函數(shù)這個(gè)概念,以及借用qsort幫助理解,并且最終用qsort的思路來(lái)實(shí)現(xiàn)冒泡

    2024年02月16日
    瀏覽(24)
  • 【再識(shí)C進(jìn)階2(中)】詳細(xì)介紹指針的進(jìn)階——函數(shù)指針數(shù)組、回調(diào)函數(shù)、qsort函數(shù)

    【再識(shí)C進(jìn)階2(中)】詳細(xì)介紹指針的進(jìn)階——函數(shù)指針數(shù)組、回調(diào)函數(shù)、qsort函數(shù)

    ??作者簡(jiǎn)介: 加油,旭杏,目前大二,正在學(xué)習(xí) C++ , 數(shù)據(jù)結(jié)構(gòu) 等?? ??作者主頁(yè):加油,旭杏的主頁(yè)?? ?本文收錄在:再識(shí)C進(jìn)階的專欄?? ??代碼倉(cāng)庫(kù):旭日東升 1?? ??歡迎大家點(diǎn)贊 ?? 收藏 ? 加關(guān)注哦!???? ???????在這一篇博客中,我們要認(rèn)識(shí)并理解 函數(shù)指

    2024年02月09日
    瀏覽(19)
  • C語(yǔ)言庫(kù)函數(shù)之 qsort 講解、使用及模擬實(shí)現(xiàn)

    C語(yǔ)言庫(kù)函數(shù)之 qsort 講解、使用及模擬實(shí)現(xiàn)

    我們?cè)趯W(xué)習(xí)排序的時(shí)候,第一個(gè)接觸到的應(yīng)該都是冒泡排序,我們先來(lái)復(fù)習(xí)一下冒泡排序的代碼,來(lái)作為一個(gè)鋪墊和引入。 代碼如下: 很簡(jiǎn)單的一種排序方法,但我們可以發(fā)現(xiàn)一個(gè)問(wèn)題,那就是冒泡排序不夠通用,它只能用于整型數(shù)組的排序,如果我要排序float類型,或者排

    2024年02月12日
    瀏覽(21)
  • 【進(jìn)階C語(yǔ)言】qsort庫(kù)函數(shù)(詳解)

    【進(jìn)階C語(yǔ)言】qsort庫(kù)函數(shù)(詳解)

    qsort是C語(yǔ)言庫(kù)函數(shù)里面的一種,包含于#include stdlib.h這個(gè)頭文件里面,使用快速排序的方法 qsort英語(yǔ)解析:Quick sort,翻譯就是快速排序,它的內(nèi)部實(shí)現(xiàn)是通過(guò)的快速排序算法來(lái)實(shí)現(xiàn)的。 功能:對(duì)傳入的任何數(shù)據(jù)進(jìn)行排序,使其變成有序數(shù)列。 qsort是可以排序任意類型的數(shù)據(jù)

    2024年02月02日
    瀏覽(23)
  • 【C語(yǔ)言進(jìn)階篇】快排函數(shù) qsort 詳細(xì)解析

    【C語(yǔ)言進(jìn)階篇】快排函數(shù) qsort 詳細(xì)解析

    ?? 鴿芷咕 :個(gè)人主頁(yè) ??? 個(gè)人專欄 :《C語(yǔ)言初階篇》 《C語(yǔ)言進(jìn)階篇》 ??生活的理想,就是為了理想的生活! ?? ?? hello! 各位寶子們大家好啊,剛開(kāi)始學(xué)編程的時(shí)候我們都是用冒泡來(lái)進(jìn)行排序的,今天給大家介紹一下新的排序方法庫(kù)函數(shù)qsort! ?? ?? sor英文原意是

    2024年02月14日
    瀏覽(23)
  • 冒泡排序模擬實(shí)現(xiàn)qsort()函數(shù)

    冒泡排序模擬實(shí)現(xiàn)qsort()函數(shù)

    要模擬qsort()函數(shù),我們首先要知道qsort()函數(shù)的特點(diǎn): 使用快速排序的方法。 適用于任何數(shù)據(jù)類型的排序。 但由于部分學(xué)者還沒(méi)有學(xué)習(xí)快速排序算法,所以本篇博客采用冒泡排序來(lái)模擬功能類似于qsort()的函數(shù)bubble_sort。 C庫(kù)對(duì)qsort()函數(shù)解釋: 我們得到的關(guān)于qsort()函數(shù)參

    2024年02月16日
    瀏覽(28)
  • qsort函數(shù)的應(yīng)用以及模擬實(shí)現(xiàn)

    qsort函數(shù)的應(yīng)用以及模擬實(shí)現(xiàn)

    ??個(gè)人主頁(yè):?? :???初階牛??? ??推薦專欄: ?????? c語(yǔ)言進(jìn)階 ??個(gè)人信條: ??知行合一 ??本篇簡(jiǎn)介::介紹庫(kù)函數(shù)qsort函數(shù)的模擬實(shí)現(xiàn)和應(yīng)用 金句分享: ?追光的人,終會(huì)光芒萬(wàn)丈.? 庫(kù)函數(shù)查詢網(wǎng)站(建議使用 舊版本 查詢) 頭文件: stdlib.h 功能介紹: 使用函數(shù) 確定順

    2024年02月02日
    瀏覽(22)
  • 模擬實(shí)現(xiàn)qsort函數(shù)(采用冒泡排序的方式)

    模擬實(shí)現(xiàn)qsort函數(shù)(采用冒泡排序的方式)

    前言: 之前我在C語(yǔ)言:指針詳解【進(jìn)階】后篇中提到了 qsort函數(shù) , qsort函數(shù) 作為一個(gè)庫(kù)函數(shù),在我們?nèi)粘5拇a編寫(xiě)中可能會(huì)用到,在上面提到的文章中我們也進(jìn)行使用了這個(gè)函數(shù),大家也了解了一些這個(gè)函數(shù)的使用方法,但我們作為學(xué)習(xí)者,我們不僅要會(huì)用,還要知道這

    2024年02月05日
    瀏覽(49)
  • 深入理解回調(diào)函數(shù)qsort:從入門到模擬實(shí)現(xiàn)

    深入理解回調(diào)函數(shù)qsort:從入門到模擬實(shí)現(xiàn)

    ??博客主頁(yè):江池俊的博客 ?收錄專欄:C語(yǔ)言進(jìn)階之路 ??專欄推薦:?C語(yǔ)言初階之路 ?數(shù)據(jù)結(jié)構(gòu)探索 ??代碼倉(cāng)庫(kù):江池俊的代碼倉(cāng)庫(kù) ??? 社區(qū):GeekHub社區(qū) ? ??歡迎大家點(diǎn)贊??評(píng)論??收藏? 回調(diào)函數(shù)和 qsort 是 C語(yǔ)言編程中重要的概念,它們?yōu)槲覀兲峁┝藦?qiáng)大的工具

    2024年02月10日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包