qsort()函數(shù)是C語言庫函數(shù)中的一種排序算法,其用到的排序思想是快速排序(quicksort)。它的獨(dú)特之處在于可以排序任意類型的數(shù)組元素(整形、浮點(diǎn)型、字符串和結(jié)構(gòu)體類型)。
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ù)類型為void*的原因是它的獨(dú)特之處,可以接收任意類型的參數(shù)。
以整形排序?yàn)槔?/p>
int cmp_int( const void * elem1, const void * elem2 )
{return *(int*)elem1-*(int*)elem2;
}
此函數(shù)為自定義函數(shù)(比較函數(shù)),函數(shù)的返回值類型為 int 類型,總共有三種情況:< 0:elem1小于elem2;0:elem1等于elem2;>0:elem1大于elem2。
(const void * elem1, const void * elem2)
兩個(gè)參數(shù)表示所要比較元素的地址,之所以參數(shù)的接收類型為 void* 是因?yàn)楸容^元素的類型是不清楚的,只能以 void* 這個(gè)萬能桶進(jìn)行接收;const表示指針?biāo)赶蛟氐闹禑o法更改。`
return *(int*)elem1-*(int*)elem2;
對兩個(gè)元素指針進(jìn)行強(qiáng)制類型轉(zhuǎn)化為整型指針,再進(jìn)行解引用獲取比較元素的值,最后將兩個(gè)元素的差值返回。當(dāng)然也可以根據(jù)比較元素的類型將其強(qiáng)制類型轉(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ù)返回類型為 int 型,浮點(diǎn)型相減的數(shù)字會丟失小數(shù)點(diǎn)后的數(shù)字從而造成誤差。若差值為大于零且小于一,則返回值會被設(shè)置為零。
4.字符串 1.按字符串首字母進(jìn)行排序int cmp_string(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;
}
2.按字符串長度進(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.一級排序:對所有學(xué)生進(jìn)行名字排序。
int cmp_name(const void* elem1, const void* elem2)
{return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);
}
2.二級排序:若名字相同則按照成績再進(jìn)行排序,若有三級排序,以此類推。
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.按字符串長度進(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)體一級排序與字符串的比較類似,直接看二級排序。
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級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站題目:C語言qsort函數(shù)的使用詳解-創(chuàng)新互聯(lián)
文章路徑:http://aaarwkj.com/article6/cociog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站收錄、響應(yīng)式網(wǎng)站、標(biāo)簽優(yōu)化、Google、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容