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

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

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

『C語(yǔ)言進(jìn)階』qsort函數(shù)及模擬實(shí)現(xiàn),C語(yǔ)言,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言,c++
??博客主頁(yè) 小羊失眠啦
??系列專(zhuān)欄 C語(yǔ)言
???每日語(yǔ)錄沒(méi)有退路,只能讓自己變得強(qiáng)大
??感謝大家點(diǎn)贊??收藏?評(píng)論??


『C語(yǔ)言進(jìn)階』qsort函數(shù)及模擬實(shí)現(xiàn),C語(yǔ)言,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言,c++

前言

在上篇指針進(jìn)階中,我們對(duì)函數(shù)指針、函數(shù)指針數(shù)組、函數(shù)指針數(shù)組指針以及回調(diào)函數(shù)有了一定的了解,文章末尾簡(jiǎn)單的對(duì)qsort函數(shù)進(jìn)行了展示,今天我們主要以qsort函數(shù)用冒泡排序的模擬實(shí)現(xiàn)以及各種類(lèi)型的排序,后面針對(duì)指針和數(shù)組一些細(xì)節(jié)上的講解~

一、qsort函數(shù)介紹

qsort是一個(gè)庫(kù)函數(shù),快速排序的方法來(lái)實(shí)現(xiàn)的, 頭文件是<stdlib.h>
qsort庫(kù)函數(shù):
void qsort( void *base, size_t num, size_t size, int (*compare )(const void *, const void *) );
傳入的參數(shù),一個(gè)是指針,一個(gè)整形,一個(gè)整形,一個(gè)函數(shù)指針;
base 數(shù)組首元素(就是數(shù)組名),num數(shù)組里有多少個(gè)元素,size每個(gè)元素的大?。▎挝皇亲止?jié)),compare指向數(shù)組中比較方式的函數(shù)指針;

功能介紹

使用函數(shù)確定順序,對(duì)指向的數(shù)組的元素進(jìn)行排序,每個(gè)元素的長(zhǎng)度以字節(jié)為單位。
此函數(shù)使用的排序算法通過(guò)調(diào)用指定的函數(shù)(要自己定義元素比較方式函數(shù)傳給qsort)并將指向元素的指針作為參數(shù)來(lái)比較元素.
該函數(shù)不返回任何值,而是通過(guò)按定義重新排序數(shù)組元素來(lái)修改指向的數(shù)組的內(nèi)容。


二、qsort函數(shù)的應(yīng)用

由于使用qsort函數(shù)時(shí),并不知道要排序的元素是什么類(lèi)型,這時(shí)需要寫(xiě)一個(gè)compare函數(shù),并對(duì)立面的參數(shù)強(qiáng)制類(lèi)型轉(zhuǎn)化

2.1 整型數(shù)組排序

#include<stdio.h>
#include<stdlib.h>
void Print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

int com_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

int main()
{
	int arr[] = { 1,3,7,5,8,9,0,2,4,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), com_int);
	Print(arr, sz);
	return 0;
}

運(yùn)行結(jié)果:

0 1 2 3 4 5 6 7 8 9

2.2 浮點(diǎn)型數(shù)組排序

#include <stdio.h>
#include <stdlib.h>
void Print(double arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%2.2lf ", arr[i]);
	}
}
int com_double(const void* e1, const void* e2)
{
	return *(double*)e1 - *(double*)e2;
}
int main()
{
	double arr[6] = { 8.26, 65.5,	73.53,	43.45,	95.3,	19.5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), com_double);
	Print(arr, sz);
	return 0;
}

運(yùn)行結(jié)果:

8.26 19.50 43.45 65.50 73.53 95.30

2.3 字符型排序

#include <stdio.h>
#include <stdlib.h>
void Print(char arr[],int sz)
{
	for (int i = 0; i < sz; i++)
		printf("%c ", arr[i]);
}
int char_sort(const void* e1, const void* e2)
{
	return (*(char*)e1) - (*(char*)e2);
}
int main()
{
	char arr[10] = { 'd','g','b','a','e','i','h','c','j','f' };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), char_sort);
	Print(arr, sz);
	return 0;
}

運(yùn)行結(jié)果:

a b c d e f g h i j

2.4 結(jié)構(gòu)體數(shù)組排序

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

typedef struct student
{
	char name[15];
	int age;
	float score;
}S;

void Print(struct student* stu,int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%-12s %-5d %-5.2fm\n", stu[i].name, stu[i].age, stu[i].score);
	}
}

int com_age(const void* e1, const void* e2)
{

	return (((S*)e1)->age - ((S*)e2)->age);
}

int com_score(const void* e1, const void* e2)
{

	return ((S*)e1)->score - ((S*)e2)->score;
}

int com_name(const void* e1, const void* e2)
{
	return strcmp(((S*)e1)->name, ((S*)e2)->name);
}

int main()
{
	
	S stu[5] = { {"chu jie niu",20,1.73f},
			{"xiao wang",19,1.68f},
			{"qing niao",21,1.59f},
			{"wao shu li",16,1.83f},
		{"peng hu wan",15,1.81f} };
	int sz = sizeof(stu) / sizeof(stu[0]), input = 0;
	qsort(stu, sz, sizeof(stu[0]), com_age);
	printf("姓名	    年齡   身高\(yùn)n");
	Print(stu, sz);
	return 0;
}

運(yùn)行結(jié)果:

姓名        年齡   身高
peng hu wan  15    1.81 m
wao shu li   16    1.83 m
xiao wang    19    1.68 m
chu jie niu  20    1.73 m
qing niao    21    1.59 m

三、qsort模擬實(shí)現(xiàn)(冒泡排序)

3.1 冒泡排序

#include <stdio.h>
void Print(int arr[], int sz)
{
	for (int 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 - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = { 5,3,7,6,1,8,9,2,4,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr,sz);
	Print(arr, sz);
	return 0;
}

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

第一步:冒泡函數(shù)的參數(shù)
首先要修改的是冒泡排序函數(shù)的參數(shù)
void bubble_sort(void* arr,size_t num,size_t width,int(*compare)(const void*,const void*))
需要注意的是qsort函數(shù)事先是不知道傳過(guò)來(lái)的數(shù)組是什么類(lèi)型,所以都先用void*接受

第二步:比較元素的方法
在對(duì)兩元素比較時(shí),事先是不知道類(lèi)型的

  1. 要先將arr強(qiáng)制類(lèi)型轉(zhuǎn)化為char*,因?yàn)橐粋€(gè)字節(jié)是類(lèi)型的最小單位,這時(shí)候就需要用到width了
  2. 元素的比較方式不再是單一的相減,這里用到自定義函數(shù),元素的比較方式函數(shù)

if(cmp((char*)arr+jwidth),(char)arr+(j+1)*width)>0)

第三步:交換函數(shù)
修改為char*類(lèi)型進(jìn)行交換

swap(char* e1, char* e2, int width)
{
	int i = 0;
	char p = 0;
	for (i = 0; i < width; i++)
	{
		p = *(e1 + i);
		*(e1 + i) = *(e2 + i);
		*(e2 + i) = p;
	}
}

注意:
void*可以接受任何類(lèi)型的變量,但是并不能直接使用,要強(qiáng)制類(lèi)型轉(zhuǎn)化為對(duì)應(yīng)類(lèi)型使用

代碼展示:

#include <stdio.h>
void Print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

void swap(char* e1, char* e2, int width)
{
	int i = 0;
	char p = 0;
	for (i = 0; i < width; i++)
	{
		p = *(e1 + i);
		*(e1 + i) = *(e2 + i);
		*(e2 + i) = p;
	}
}

void bubble_sort(void* base, int sz, int width, int (*cmp)(const void* e1, const void* e2))
{
	int i = 0;
	int j = 0;
	for (i = 0; i < sz; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{
				swap((char*)base + j * width, (char*)base + (j + 1) * width, width);//一個(gè)字節(jié)一個(gè)字節(jié)的交換
			}
		}
	}
}

int com_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr[] = { 1, 3, 6, 2, 0, 9, 4, 8, 5, 7 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), com_int);
	Print(arr, sz);
	return 0;
}

qsort函數(shù)用冒泡排序的模擬實(shí)現(xiàn)就講到這里,指針的進(jìn)階也到此結(jié)束了,接下來(lái)對(duì)指針和數(shù)組一些細(xì)節(jié)上的補(bǔ)充到時(shí)候會(huì)在文章見(jiàn)分曉,歡迎大家互三,一起交流,互相學(xué)習(xí)~~

『C語(yǔ)言進(jìn)階』qsort函數(shù)及模擬實(shí)現(xiàn),C語(yǔ)言,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言,c++文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-731926.html

到了這里,關(guān)于『C語(yǔ)言進(jìn)階』qsort函數(shù)及模擬實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(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)文章

  • 【進(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是可以排序任意類(lèi)型的數(shù)據(jù)

    2024年02月02日
    瀏覽(23)
  • 【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日
    瀏覽(23)
  • 【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)
  • 冒泡排序模擬實(shí)現(xiàn)qsort()函數(shù)

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

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

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

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

    ??個(gè)人主頁(yè):?? :???初階牛??? ??推薦專(zhuān)欄: ?????? 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:從入門(mén)到模擬實(shí)現(xiàn)

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

    ??博客主頁(yè):江池俊的博客 ?收錄專(zhuān)欄:C語(yǔ)言進(jìn)階之路 ??專(zhuā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)
  • 【進(jìn)階C語(yǔ)言】各大常用庫(kù)函數(shù)的模擬實(shí)現(xiàn)

    【進(jìn)階C語(yǔ)言】各大常用庫(kù)函數(shù)的模擬實(shí)現(xiàn)

    前言 今天恒川帶給大家的是平常應(yīng)用的庫(kù)函數(shù),恒川來(lái)給大家都模擬實(shí)現(xiàn)一下,希望對(duì)大家有幫助??! 三種方式: 方式1: 方式2: 方式3: 參考代碼: 參考代碼: 參考代碼: 參考代碼: 參考代碼: 如果這份博客對(duì)大家有幫助,希望各位給恒川一個(gè)免費(fèi)的點(diǎn)贊作為鼓勵(lì),

    2023年04月09日
    瀏覽(19)
  • 用冒泡排序?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日
    瀏覽(26)
  • c語(yǔ)言用冒泡排序模擬實(shí)現(xiàn)qsort排序

    c語(yǔ)言用冒泡排序模擬實(shí)現(xiàn)qsort排序

    1、簡(jiǎn)單介紹冒泡排序 冒泡排序就是兩兩相鄰元素進(jìn)行比較,如果不滿足順序就進(jìn)行交換?,F(xiàn)有一組整數(shù),將其用冒泡排序?qū)崿F(xiàn)排序?yàn)樯颉?假設(shè)有這樣一組整數(shù):9 8 7 6 5? ? 由此可知,如果一個(gè)整型數(shù)組有num個(gè)元素,則需走num-1趟,若走在第i趟,則在第i趟內(nèi)需要比較num-1

    2024年02月15日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包