C語(yǔ)言qsort函數(shù)的使用詳解-創(chuàng)新互聯(lián)

文章目錄
  • 一、qsort函數(shù)簡(jiǎn)介
    • 1.函數(shù)原型
    • 2.參數(shù)含義
    • 3.比較函數(shù)詳解
  • 二、比較函數(shù)使用案例
    • 1.整型數(shù)組
    • 2.字符數(shù)組
    • 3.double型數(shù)組
    • 4.字符串
      • 1.按字符串首字母進(jìn)行排序
      • 2.按字符串長(zhǎng)度進(jìn)行排序
      • 3.按字典進(jìn)行排序
    • 5.結(jié)構(gòu)體
  • 三、qsort函數(shù)完整使用案例
    • 1.整型數(shù)組
    • 2.字符數(shù)組
    • 3.double型數(shù)組
    • 4.字符串
      • 1.按字符串首字母進(jìn)行排序
      • 2.按字符串長(zhǎng)度進(jìn)行排序
      • 3.按字典進(jìn)行排序
    • 5.結(jié)構(gòu)體

創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比循化網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式循化網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋循化地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。一、qsort函數(shù)簡(jiǎn)介

qsort()函數(shù)是C語(yǔ)言庫(kù)函數(shù)中的一種排序算法,其用到的排序思想是快速排序(quicksort)。它的獨(dú)特之處在于可以排序任意類(lèi)型的數(shù)組元素(整形、浮點(diǎn)型、字符串和結(jié)構(gòu)體類(lèi)型)。

1.函數(shù)原型
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );
2.參數(shù)含義

void * base:待排序數(shù)組的首地址。
size_t num:數(shù)組元素的個(gè)數(shù)。
size_t size:一個(gè)數(shù)組元素的大?。ㄋ甲止?jié)數(shù))。
int ( * comparator ) ( const void *, const void * ):首先它是一個(gè)函數(shù)指針,指向的函數(shù)是排序函數(shù);其此所包含的兩個(gè)參數(shù)為所比較元素的地址;最后是參數(shù)類(lèi)型為void*的原因是它的獨(dú)特之處,可以接收任意類(lèi)型的參數(shù)。

3.比較函數(shù)詳解

以整形排序?yàn)槔?/p>

int cmp_int( const void * elem1, const void * elem2 )
{return *(int*)elem1-*(int*)elem2;
}

此函數(shù)為自定義函數(shù)(比較函數(shù)),函數(shù)的返回值類(lèi)型為 int 類(lèi)型,總共有三種情況:< 0:elem1小于elem2;0:elem1等于elem2;>0:elem1大于elem2。

(const void * elem1, const void * elem2)

兩個(gè)參數(shù)表示所要比較元素的地址,之所以參數(shù)的接收類(lèi)型為 void* 是因?yàn)楸容^元素的類(lèi)型是不清楚的,只能以 void* 這個(gè)萬(wàn)能桶進(jìn)行接收;const表示指針?biāo)赶蛟氐闹禑o(wú)法更改。`

return *(int*)elem1-*(int*)elem2;

對(duì)兩個(gè)元素指針進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)化為整型指針,再進(jìn)行解引用獲取比較元素的值,最后將兩個(gè)元素的差值返回。當(dāng)然也可以根據(jù)比較元素的類(lèi)型將其強(qiáng)制類(lèi)型轉(zhuǎn)化。

二、比較函數(shù)使用案例 1.整型數(shù)組
int cmp_int(const void* elem1, const void* elem2)
{return *(int*)elem1 - *(int*)elem2;
}
2.字符數(shù)組
int cmp_char(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;
}
3.double型數(shù)組
int cmp_double(const void* elem1, const void* elem2)
{return *(double*)elem1 >*(double*)elem2 ? 1 : -1;
}

注:此函數(shù)返回類(lèi)型為 int 型,浮點(diǎn)型相減的數(shù)字會(huì)丟失小數(shù)點(diǎn)后的數(shù)字從而造成誤差。若差值為大于零且小于一,則返回值會(huì)被設(shè)置為零。

4.字符串 1.按字符串首字母進(jìn)行排序
int cmp_string(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;
}
2.按字符串長(zhǎng)度進(jìn)行排序
int cmp_string(const void* elem1, const void* elem2)  
{return strlen((char * )elem1) >strlen((char * )elem2) ? 1 : -1;  
}
3.按字典進(jìn)行排序
int cmp_string(const void* elem1, const void* elem2)
{return strcmp((char*)elem1,(char*)elem2);
}
5.結(jié)構(gòu)體
struct Stu
{char name[10];
   int grade;
} s;

1.一級(jí)排序:對(duì)所有學(xué)生進(jìn)行名字排序。

int cmp_name(const void* elem1, const void* elem2)
{return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);
}

2.二級(jí)排序:若名字相同則按照成績(jī)?cè)龠M(jìn)行排序,若有三級(jí)排序,以此類(lèi)推。

int cmp_s(const void* elem1, const void* elem2)
{if ((strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name))!=0)
		return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);
	else
		return ((Stu*)elem1)->grade - ((Stu*)elem2)->grade;
}
三、qsort函數(shù)完整使用案例 1.整型數(shù)組
int cmp_int(const void* elem1, const void* elem2)
{return *(int*)elem1 - *(int*)elem2;
}
int main()
{int arr[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	for (int i = 0; i< sz; i++)
	{printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

在這里插入圖片描述

2.字符數(shù)組
int cmp_char(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;
}
int main()
{char arr[] = {'g', 'f', 'e', 'd', 'c', 'b', 'a' };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_char);
	for (int i = 0; i< sz; i++)
	{printf("%c ", arr[i]);
	}
	printf("\n");
	return 0;
}

在這里插入圖片描述

3.double型數(shù)組
int cmp_double(const void* elem1, const void* elem2)
{return *(double*)elem1 >*(double*)elem2 ? 1 : -1;
}
int main()
{double arr[10] = {5.32, 9.34, 1.27, 0.28, 0.98, 8.98, 5.69, 4.33, 7.01, 9.90 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_double);
	for (int i = 0; i< sz; i++)
	{printf("%f ", arr[i]);
	}
	printf("\n");
	return 0;
}

在這里插入圖片描述

4.字符串 1.按字符串首字母進(jìn)行排序
int cmp_string(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2; 
}
int main()
{char arr[6][10] = {"grape", "face", "dog", "cat", "black", "apple" };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_string);
	for (int i = 0; i< sz; i++)
	{printf("%s ", arr[i]);
	}
	printf("\n");
	return 0;
}

在這里插入圖片描述

2.按字符串長(zhǎng)度進(jìn)行排序
int cmp_string(const void* elem1, const void* elem2)  
{return strlen((char * )elem1) >strlen((char * )elem2) ? 1 : -1;  
}
int main()
{char arr[6][10] = {"aaa", "aaaaa", "aaaaaaa", "aaaaaa", "aa", "aaaa" };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_string);
	for (int i = 0; i< sz; i++)
	{printf("%s ", arr[i]);
	}
	printf("\n");
	return 0;
}

在這里插入圖片描述

3.按字典進(jìn)行排序
int cmp_string(const void* elem1, const void* elem2)
{return strcmp((char*)elem1,(char*)elem2);
}
int main()
{char arr[6][10] = {"grrfdg","adew","gderfe","abrfggfe","lerf","lmnp" };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_string);
	for (int i = 0; i< sz; i++)
	{printf("%s ", arr[i]);
	}
	printf("\n");
	return 0;
}

在這里插入圖片描述

5.結(jié)構(gòu)體

一級(jí)排序與字符串的比較類(lèi)似,直接看二級(jí)排序。

typedef struct Stu
{char name[10];
	int grade;
}Stu;
int cmp_s(const void* elem1, const void* elem2)
{if ((strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name))!=0)
		return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);
	else
		return ((Stu*)elem1)->grade - ((Stu*)elem2)->grade;
}
int main()
{Stu s[] = {{"zhaoda", 89 }, {"qianer", 100 }, {"sunsan", 101 }, {"lisi", 121 }, {"sunsan", 95 }, {"zhaoda",78} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_s);
	for (int i = 0; i< sz; i++)
	{printf("%s %d\n", s[i].name,s[i].grade);
	}
	return 0;
}

在這里插入圖片描述

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

網(wǎng)站題目:C語(yǔ)言qsort函數(shù)的使用詳解-創(chuàng)新互聯(lián)
文章路徑:http://muchs.cn/article6/cociog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站收錄、響應(yīng)式網(wǎng)站、標(biāo)簽優(yōu)化Google全網(wǎng)營(yíng)銷(xiāo)推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名