qsort()函数详解
一、寫在開頭
? ? 1.1 本節(jié)內(nèi)容
? ? ? ?學(xué)習(xí)C語言中的qsort()函數(shù)。
二、qsort()
? ? 2.1 函數(shù)原型
void qsort(void *base,size_t nmemb,size_t size,int (*compar)(const void *, const void *) );? ? ? ?函數(shù)功能:qsort()函數(shù)的功能是對數(shù)組進(jìn)行排序,數(shù)組有nmemb個元素,每個元素大小為size。
? ? ? ?參數(shù)base? ? ?-base指向數(shù)組的起始地址,通常該位置傳入的是一個數(shù)組名
? ? ? ?參數(shù)nmemb -nmemb表示該數(shù)組的元素個數(shù)
? ? ? ?參數(shù)size? ? ? ?-size表示該數(shù)組中每個元素的大小(字節(jié)數(shù))
? ? ? ?參數(shù)(*compar)(const void *, const void *)? - 此為指向比較函數(shù)的函數(shù)指針,決定了排序的順序。
? ? ? ?函數(shù)返回值:無。
? ? ? ?注意:如果兩個元素的值是相同,那么它們的前后順序是不確定的。也就是說qsort()是一個不確定的排序算法。
? ? 2.2 compar參數(shù)
? ? ? ?compar參數(shù)指向一個比較兩個元素的函數(shù)。比較函數(shù)的原型應(yīng)該像下面這樣,注意兩個形參必須是const void *型,同時在調(diào)用compar函數(shù)(compar實質(zhì)為函數(shù)指針,這里稱它所指向的函數(shù)也為compar)時,傳入的實參也必須轉(zhuǎn)換成const void *型。在compar函數(shù)內(nèi)部會將const void *型轉(zhuǎn)換成實際類型,見下文:
int compar(const void *p1, const void *p2);? ?如果compar返回值小于0(<0),那么p2所指向元素會被排在p2所指向元素的前面
? ?如果compar返回值等于0(=0),那么p2所指向元素與p2所指向元素的順序不確定
? ?如果compar返回值大于0(>0),那么p1所指向元素會被排在p2所指向元素的后面
? ?因此,如果想讓qsort()進(jìn)行從小到大(升序)排序,那么一個通用的compar函數(shù)可以寫成這樣:
int compareMyType(const void *a, const void *b) {if (*(MyType *)a < *(MyType *)b) return -1;if (*(MyType *)a == *(MyType *)b) return 0;if (*(MyType *)a > *(MyType *)b) return 1; }? ? 注意:你要將MyType換成實際數(shù)組元素的類型。
? ? 2.3 一個使用qsort()函數(shù)的小例子
/* qsort example */ #include <stdio.h> /* printf */ #include <stdlib.h> /* qsort */int values[] = { 40, 10, 100, 90, 20, 25 };int compare (const void *a, const void *b) {return (*(int *)a - *(int *)b); }int main() {int n;qsort(values, 6, sizeof(int), compare);for (n=0; n<6; n++) printf("%d ", values[n]);return 0; }? ? ? ? 分析一個compare函數(shù)。如果a小于b,則返回值為負(fù)數(shù)(<0),也即a會排在b的前面。同理,若a大于b,則a會排在b的前面。所以,這里的qsort()為從小到大即升序排序。因此,運行結(jié)果為:10 20 25 40 90 100
? ? 2.4 修改compare(), 使qsort()為降序排序
? ? ? 很簡單,只要將上面compare()中的
return (*(int *)a - *(int *)b);? ? ? ? 改為:
return (*(int *)b - *(int *)a);三、參考資料
? ? ?1.?qsort - C++ Reference
? ? ?2.man qsort
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的qsort()函数详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Cocos2d-x3.x游戏开发之旅》
- 下一篇: 学习《apache源代码全景分析》之DS