真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C語言學(xué)習(xí)qsort()函數(shù)及模擬實(shí)現(xiàn)-全解析-創(chuàng)新互聯(lián)

目錄

10年積累的做網(wǎng)站、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有潮安免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

一、認(rèn)識qsort()函數(shù)

二、使用qsort()函數(shù)

?1:??冒泡排序:?C語言實(shí)現(xiàn)冒泡排序【全解析】_weixin_52872520的博客-博客

?2:qsort()函數(shù):

3:具體使用:

三、模擬實(shí)現(xiàn)qsort()函數(shù)

四、以排序整形為例講解qsort()函數(shù)


一、認(rèn)識qsort()函數(shù)
void qsort( void *base,    //待排序數(shù)組的起始地址
            size_t num,    //元素個數(shù)
            size_t width,  //一個元素的大小,單位:字節(jié)
            int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
            //兩個元素的比較函數(shù)
            //通過函數(shù)指針調(diào)用自己定義的比較函數(shù),這個定義的比較函數(shù)被稱為回調(diào)函數(shù)
二、使用qsort()函數(shù) ? ? ? ?1:??冒泡排序:?C語言實(shí)現(xiàn)冒泡排序【全解析】-博客 ? ? ? ?2:qsort()函數(shù):

在冒泡排序中,已經(jīng)實(shí)現(xiàn)了整形數(shù)組的排序,可是對于字符數(shù)組、浮點(diǎn)型數(shù)組、結(jié)構(gòu)體數(shù)組等其他類型的排序就不用去自己寫算法實(shí)現(xiàn),而是通過qsort() - 快速排序?qū)崿F(xiàn)。

int ( *compare )(const void *elem1, const void *elem2 )

函數(shù)的形參被指定為 void* ,可以理解為 void* 為一個通用指針(垃圾桶),可以接收任何類型的指針,void* 的指針不能解引用和 ++,即不能直接使用。但是可以對 void* 的指針進(jìn)行強(qiáng)制類型轉(zhuǎn)換后使用。

例如:

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

在比較函數(shù)中:

3:具體使用:

? 快速排序整形數(shù)組:

#include#includeint cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
void main()
{

	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//庫函數(shù)中一個排序函數(shù):qsort
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	//0 1 2 3 4 5 6 7 8 9
	//打印
	int i = 0;
	for (i = 0; i< sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

? 快速排序結(jié)構(gòu)體:

#include#includestruct Stu
{
	char name[20];
	int age;
};

//按照學(xué)生的年齡來排序
int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//按照學(xué)生的名字來排序
int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//strcmp() : 字符串比較函數(shù):按照對應(yīng)位置上的字符串大小進(jìn)行比較的
//abcdef  小
//abd     大

int  main()
{
	struct Stu s[3] = { {"zhangsan",20}, {"lisi", 50}, {"wangwu", 33} };
	int sz = sizeof(s) / sizeof(s[0]);
	//qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
	return 0;
}
三、模擬實(shí)現(xiàn)qsort()函數(shù)

? 改造冒泡排序函數(shù),使得該函數(shù)可以排序任意指定的數(shù)組。

//使用我們自己寫的bubble_sort函數(shù)排序整型數(shù)組
#include#include//
//實(shí)現(xiàn)一個比較整型的函數(shù)
// 
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
struct Stu
{
	char name[20];
	int age;
};
//按照學(xué)生的年齡來排序
int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//按照學(xué)生的名字來排序
int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//strcmp() : 字符串比較函數(shù):按照對應(yīng)位置上的字符串大小進(jìn)行比較的
//abcdef  小
//abd     大
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ù),使得這個函數(shù)可以排序任意指定的數(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++)
	{
		//一趟冒泡排序的過程
		size_t j = 0;
		for (j = 0; j< sz - 1 - i; j++)
		{
			//判斷
			//base為void*,需要強(qiáng)制類型轉(zhuǎn)換為char*【僅為一個字節(jié)】,可以靈活運(yùn)用;j * width:跳過的步長
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) >0)//用自定義的cmp函數(shù)來比較;
			{
				//交換
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}


void test1()
{
	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);
	int i = 0;
	for (i = 0; i< sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
//使用我們自己寫的bubble_sort函數(shù)排序結(jié)構(gòu)體數(shù)組
void test2()
{
	struct Stu s[3] = { {"zhangsan",20}, {"lisi", 50}, {"wangwu", 33} };
	int sz = sizeof(s) / sizeof(s[0]);
	//bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_age);
	bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}

int main()
{
	test1();
	//test2();
	return 0;
}
四、以排序整形為例講解qsort()函數(shù)

Ⅰ:定義一個降序的整形數(shù)組;

Ⅱ:求得整型數(shù)組的大?。?/p>

Ⅲ:進(jìn)入bubble_sort()函數(shù)進(jìn)行排序;

? Ⅲ①:理解整個bubble_sort函數(shù);

? Ⅲ②:利用兩層for循環(huán)來達(dá)到冒泡排序的效果;

? Ⅲ③:判斷前兩個元素的大小:將void*base 的指針強(qiáng)制類型轉(zhuǎn)換為char*,而 j*width 則為一個數(shù)據(jù)的大小,利用cmp()函數(shù)進(jìn)行比較;

Ⅲ④:實(shí)現(xiàn)cmp_int();整形比較的函數(shù)

? Ⅲ⑤:實(shí)現(xiàn)兩個元素的交換;

Ⅳ:依照冒泡排序的思想,在bubble_sout()函數(shù)中不斷排序,達(dá)到對整形數(shù)組排序的效果;

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


當(dāng)前標(biāo)題:C語言學(xué)習(xí)qsort()函數(shù)及模擬實(shí)現(xiàn)-全解析-創(chuàng)新互聯(lián)
分享鏈接:http://weahome.cn/article/dgdieh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部