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

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

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

c語(yǔ)言qsort什么意思,進(jìn)階C語(yǔ)言,c語(yǔ)言,排序算法,算法,經(jīng)驗(yàn)分享,開(kāi)發(fā)語(yǔ)言

1. qsort到底是什么?

qsort是C語(yǔ)言庫(kù)函數(shù)里面的一種,包含于#include <stdlib.h>這個(gè)頭文件里面,使用快速排序的方法

2. qsort庫(kù)函數(shù)的功能

qsort英語(yǔ)解析:Quick sort,翻譯就是快速排序,它的內(nèi)部實(shí)現(xiàn)是通過(guò)的快速排序算法來(lái)實(shí)現(xiàn)的。
功能:對(duì)傳入的任何數(shù)據(jù)進(jìn)行排序,使其變成有序數(shù)列。

void qsort(void* base, //指向了待排序數(shù)組的第一個(gè)元素
	       size_t num,   //待排序的元素個(gè)數(shù)
	       size_t size, //每個(gè)元素的大小,單位是字節(jié)
	       int (* cmp)(const void*, const void*) //指向一個(gè)函數(shù),這個(gè)函數(shù)可以比較2個(gè)元素的大小
          );

qsort是可以排序任意類(lèi)型的數(shù)據(jù)

  1. 比較2個(gè)整數(shù)的大小,> < ==
  2. 比較2個(gè)字符串的大小,strcmp
  3. 比較2個(gè)結(jié)構(gòu)體數(shù)據(jù)(學(xué)生:張三,李四)指定比較的標(biāo)準(zhǔn),拿什么比較?

3. qosrt函數(shù)詳解

在C語(yǔ)言庫(kù)中是這樣定義的:

void qsort (void* base, size_t num, size_t width, int (cmp)(const void, const void* ))

剖析:

返回類(lèi)型void:我們改變的是數(shù)列的排序,實(shí)際只需要進(jìn)行內(nèi)存的操作,所以不需要返回值。

參數(shù)講解:

void*
base:base基本,即表示應(yīng)傳入初始地址,至于為什么是void類(lèi)型,它不知道我們會(huì)傳入什么數(shù)據(jù),而void類(lèi)型就像一個(gè)垃圾桶一樣什么地址都可以仍進(jìn)去,所以只能用void*類(lèi)型。

size_t num:num數(shù)量,表示應(yīng)傳入的元素個(gè)數(shù)

size_t width:width寬度,表示應(yīng)傳入的每個(gè)元素占的字節(jié)大小

int (*cmp)(const void *, const void *):
應(yīng)傳入一個(gè)比較函數(shù)地址,用于比較兩個(gè)數(shù)據(jù)的大小,因?yàn)閭魅氲臄?shù)據(jù)類(lèi)型是不確定的,所以我們需要自己定義一個(gè)比較函數(shù)傳到qsort比較函數(shù)里面去,以便它知道怎么樣去比較兩個(gè)數(shù)據(jù)的大小。

4. 冒泡排序的實(shí)現(xiàn)

void bubble_sort(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		//一趟冒泡排序的過(guò)程
		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 print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	//排序
	//使用冒泡排序的算法,來(lái)排序
	int sz = sizeof(arr) / sizeof(arr[0]);
	//
	bubble_sort(arr, sz);
	//打印
	print_arr(arr, sz);

	return 0;
}

5. qsort庫(kù)函數(shù)如何實(shí)現(xiàn)冒泡排序

排成升序的版本:

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

//qsort函數(shù)的使用者提供這個(gè)函數(shù)
int cmp_int(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2; //排成升序的
}

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

test1()
{
	int arr[] = { 3,1,5,2,4,9,8,6,5,7 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//使用qsort來(lái)排序整型數(shù)組,這里就要提供一個(gè)比較函數(shù),這個(gè)比較函數(shù)能夠比較2個(gè)整數(shù)的大小
	//qsort 默認(rèn)是排成升序的
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);
}
int main()
{
	test1();
	return 0;
}

c語(yǔ)言qsort什么意思,進(jìn)階C語(yǔ)言,c語(yǔ)言,排序算法,算法,經(jīng)驗(yàn)分享,開(kāi)發(fā)語(yǔ)言

排成降序的版本:

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

//qsort函數(shù)的使用者提供這個(gè)函數(shù)
int cmp_int(const void* p1, const void* p2)
{
	return *(int*)p2 - *(int*)p1; //排成降序的
}

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

test1()
{
	int arr[] = { 3,1,5,2,4,9,8,6,5,7 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//使用qsort來(lái)排序整型數(shù)組,這里就要提供一個(gè)比較函數(shù),這個(gè)比較函數(shù)能夠比較2個(gè)整數(shù)的大小
	//qsort 默認(rèn)是排成升序的
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);
}
int main()
{
	test1();
	return 0;
}

c語(yǔ)言qsort什么意思,進(jìn)階C語(yǔ)言,c語(yǔ)言,排序算法,算法,經(jīng)驗(yàn)分享,開(kāi)發(fā)語(yǔ)言

6. qsort庫(kù)函數(shù)排序結(jié)構(gòu)體數(shù)據(jù)

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

//測(cè)試qsort 排序結(jié)構(gòu)體數(shù)據(jù)
struct Stu
{
	char name[20];
	int age;
};

//按照年齡來(lái)比較
int cmp_stu_by_age(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}

int cmp_stu_by_name(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}

void test2()
{
	struct Stu s[] = { {"zhangsan", 30}, {"lisi", 25}, {"wangwu", 50} };
	int sz = sizeof(s) / sizeof(s[0]);
	//測(cè)試按照年齡來(lái)排序
	//qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
	//測(cè)試按照名字來(lái)排序
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{
	test2();
	return 0;
}

7. 使用冒泡排序的思想來(lái)實(shí)現(xiàn)類(lèi)似于qsort

模擬一下
但是因?yàn)槲覀儧](méi)有學(xué)習(xí)快速排序的思想
所以我們使用冒泡排序的思想來(lái)實(shí)現(xiàn)類(lèi)似于qsort這個(gè)功能的冒泡排序函數(shù)bubble_sort.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp_int(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
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++;
	}
}

//假設(shè)排序?yàn)樯?/span>
//希望這個(gè)bubble_sort函數(shù)可以排序任意類(lèi)型的數(shù)據(jù)
void bubble_sort(void* base, size_t num, size_t width, int (*cmp)(const void* p1, const void* p2))
{
	//要確定趟數(shù)
	size_t i = 0;
	for (i = 0; i < num - 1; i++)
	{
		int flag = 1;//假設(shè)已經(jīng)有序了
		//一趟冒泡排序的過(guò)程
		size_t j = 0;
		for (j = 0; j < num - 1 - i; j++)
		{
			//兩個(gè)相鄰的元素比較
			//arr[j] arr[j+1]
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)  //改成小于0就變?yōu)榻敌?/span>
			{
				//交換
				flag = 0;
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
		if (flag == 1)
		{
			break;
		}
	}
}

void test3()
{
	int arr[] = { 3,1,5,2,4,9,8,6,5,7 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);
}
int main()
{
	test3();
	return 0;
}

圖片流程詳解:
c語(yǔ)言qsort什么意思,進(jìn)階C語(yǔ)言,c語(yǔ)言,排序算法,算法,經(jīng)驗(yàn)分享,開(kāi)發(fā)語(yǔ)言
在練習(xí)一下模擬qsort庫(kù)函數(shù)排序結(jié)構(gòu)體數(shù)據(jù),道理相同。

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

//測(cè)試qsort 排序結(jié)構(gòu)體數(shù)據(jù)
struct Stu
{
	char name[20];
	int age;
};

//按照年齡來(lái)比較
int cmp_stu_by_age(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}

int cmp_stu_by_name(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}
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++;
	}
}
//假設(shè)排序?yàn)樯?/span>
//希望這個(gè)bubble_sort函數(shù)可以排序任意類(lèi)型的數(shù)據(jù)
void bubble_sort(void* base, size_t num, size_t width,
	int (*cmp)(const void* p1, const void* p2))
{
	//要確定趟數(shù)
	size_t i = 0;
	for (i = 0; i < num - 1; i++)
	{
		int flag = 1;//假設(shè)已經(jīng)有序了
		//一趟冒泡排序的過(guò)程
		size_t j = 0;
		for (j = 0; j < num - 1 - i; j++)
		{
			//兩個(gè)相鄰的元素比較
			//arr[j] arr[j+1]
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{
				//交換
				flag = 0;
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
		if (flag == 1)
		{
			break;
		}
	}
}

void test4()
{
	struct Stu s[] = { {"zhangsan", 30}, {"lisi", 25}, {"wangwu", 50} };
	int sz = sizeof(s) / sizeof(s[0]);
	//測(cè)試按照年齡來(lái)排序
	//bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_age);
	//測(cè)試按照名字來(lái)排序
	bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{
	test4();
	return 0;
}

如果這份博客對(duì)大家有幫助,希望各位給恒川一個(gè)免費(fèi)的點(diǎn)贊作為鼓勵(lì),并評(píng)論收藏一下,謝謝大家?。。?br> 制作不易,如果大家有什么疑問(wèn)或給恒川的意見(jiàn),歡迎評(píng)論區(qū)留言。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-785953.html

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

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(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)文章

  • 用冒泡排序?qū)崿F(xiàn)快速排序(qsort函數(shù)),指針進(jìn)階實(shí)例

    用冒泡排序?qū)崿F(xiàn)快速排序(qsort函數(shù)),指針進(jìn)階實(shí)例

    目錄 ? 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é) ? ? ? ? ? qsort函數(shù)是c語(yǔ)言自帶的函數(shù),其功能是實(shí)現(xiàn)快速排序。我們來(lái)看一下他的參數(shù)和返回值: ? ? ? ? 以上就是qsort的參數(shù)和返回值,可以看到,

    2024年02月21日
    瀏覽(25)
  • C語(yǔ)言快速排序——qsort函數(shù)

    C語(yǔ)言快速排序——qsort函數(shù)

    ? 上面的是我們標(biāo)準(zhǔn)C語(yǔ)言庫(kù)里面對(duì)qsort函數(shù)的介紹,我們先來(lái)從排序說(shuō)起:? 這就不得不提出編程中最最基礎(chǔ)的排序算法--- 冒泡排序? 對(duì)于一個(gè)任意的無(wú)序數(shù)列,我們?nèi)绻胍阉懦身樞驍?shù)列的話(huà),我們就可以讓每一項(xiàng)跟后面的一項(xiàng)去比較,然后交換兩個(gè)數(shù),最終得到一個(gè)

    2024年01月22日
    瀏覽(21)
  • 『C語(yǔ)言進(jìn)階』qsort函數(shù)及模擬實(shí)現(xiàn)

    『C語(yǔ)言進(jìn)階』qsort函數(shù)及模擬實(shí)現(xiàn)

    ?? 博客主頁(yè) : 小羊失眠啦 ?? 系列專(zhuān)欄 : C語(yǔ)言 ??? 每日語(yǔ)錄 : 沒(méi)有退路,只能讓自己變得強(qiáng)大 ?? 感謝大家點(diǎn)贊??收藏?評(píng)論?? 在上篇指針進(jìn)階中,我們對(duì)函數(shù)指針、函數(shù)指針數(shù)組、函數(shù)指針數(shù)組指針以及回調(diào)函數(shù)有了一定的了解,文章末尾簡(jiǎn)單的對(duì)qsort函數(shù)進(jìn)

    2024年02月07日
    瀏覽(25)
  • C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù)qsort( )——數(shù)據(jù)排序

    C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù)qsort( )——數(shù)據(jù)排序

    ?? 大家好!我是保護(hù)小周?,本期為大家?guī)?lái)的是深度解剖C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù) qsort(), qsort()函數(shù)他可以對(duì) 任意類(lèi)型 的數(shù)據(jù)排序, 博主會(huì)詳細(xì)解釋函數(shù)使用方法,以及使用快速排序的左右指針?lè)M實(shí)現(xiàn)函數(shù)功能 , 這樣的排序確定不來(lái)學(xué)習(xí)一下嗎??? ? 目錄 一、qsort()函

    2024年02月03日
    瀏覽(29)
  • 排序之玩轉(zhuǎn)qsort函數(shù)——【C語(yǔ)言】

    排序之玩轉(zhuǎn)qsort函數(shù)——【C語(yǔ)言】

    說(shuō)起排序,我們會(huì)想起許多算法,在之前的博客中我也寫(xiě)到過(guò),比如:冒泡排序法、快速排序法、選擇排序法等等。其實(shí)在C語(yǔ)言中一直有一個(gè)可以將數(shù)組中的內(nèi)容進(jìn)行排序的函數(shù)且功能完善內(nèi)容齊全的庫(kù)函數(shù)——qsort函數(shù)。今天就讓我們來(lái)探索一下吧! 目錄 回調(diào)函數(shù) 初始

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

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

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

    2024年02月14日
    瀏覽(22)
  • C語(yǔ)言題目 - 調(diào)用qsort函數(shù)對(duì)數(shù)組進(jìn)行排序

    如題 其實(shí)沒(méi)什么難的,只要嚴(yán)格按照 qsort 函數(shù)的參數(shù)來(lái)填充即可,這里要用到 函數(shù)指針 。 qsort 函數(shù)的原型如下: void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *)); 參數(shù)說(shuō)明: base :指向需要排序的數(shù)組的指針,數(shù)組中每個(gè)元素的大小應(yīng)為 size 字節(jié)。

    2024年02月11日
    瀏覽(20)
  • 【C語(yǔ)言】——指針六:冒泡排序與qsort函數(shù)的實(shí)現(xiàn)

    【C語(yǔ)言】——指針六:冒泡排序與qsort函數(shù)的實(shí)現(xiàn)

    1.1、冒泡排序的原理 ?? ??在實(shí)踐過(guò)程中,我們難免會(huì)碰到要給一組數(shù)據(jù)排序的情況。如果我們掌握一些排序的算法,效率就會(huì)高很多。排序的方法有方法有很多,如:希爾排序,快速排序,堆排序……,今天,我們講的排序方法就是—— 冒泡排序 ! ?? ??冒泡排序

    2024年04月16日
    瀏覽(25)
  • 【C語(yǔ)言】指針的進(jìn)階(二)—— 回調(diào)函數(shù)的講解以及qsort函數(shù)的使用方式

    【C語(yǔ)言】指針的進(jìn)階(二)—— 回調(diào)函數(shù)的講解以及qsort函數(shù)的使用方式

    目錄 1、函數(shù)指針數(shù)組 1.1、函數(shù)指針數(shù)組是什么? ?1.2、函數(shù)指針數(shù)組的用途:轉(zhuǎn)移表 2、擴(kuò)展:指向函數(shù)指針的數(shù)組的指針 3、回調(diào)函數(shù) 3.1、回調(diào)函數(shù)介紹 ?3.2、回調(diào)函數(shù)的案例:qsort函數(shù) 3.2.1、回顧冒泡排序 ?3.2.1、什么是qsort函數(shù)? 函數(shù)指針數(shù)組 是什么?首先主語(yǔ)是 數(shù)

    2024年02月07日
    瀏覽(23)
  • C語(yǔ)言-指針進(jìn)階-qsort函數(shù)的學(xué)習(xí)與模擬實(shí)現(xiàn)(9.3)

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

    目錄 思維導(dǎo)圖: 回調(diào)函數(shù) qsort函數(shù)介紹 模擬實(shí)現(xiàn)qsort 寫(xiě)在最后: 什么是回調(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í), 我們就將此稱(chēng)為回調(diào)函數(shù)。 在舉例之前,我們先學(xué)習(xí)一個(gè)C語(yǔ)言

    2024年02月15日
    瀏覽(18)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包