日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

qsort()函数详解

發布時間:2024/1/23 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qsort()函数详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、寫在開頭

? ? 1.1 本節內容

? ? ? ?學習C語言中的qsort()函數。

二、qsort()

? ? 2.1 函數原型

void qsort(void *base,size_t nmemb,size_t size,int (*compar)(const void *, const void *) );

? ? ? ?函數功能:qsort()函數的功能是對數組進行排序,數組有nmemb個元素,每個元素大小為size。

? ? ? ?參數base? ? ?-base指向數組的起始地址,通常該位置傳入的是一個數組名

? ? ? ?參數nmemb -nmemb表示該數組的元素個數

? ? ? ?參數size? ? ? ?-size表示該數組中每個元素的大小(字節數)

? ? ? ?參數(*compar)(const void *, const void *)? - 此為指向比較函數的函數指針,決定了排序的順序。

? ? ? ?函數返回值:無。

? ? ? ?注意:如果兩個元素的值是相同,那么它們的前后順序是不確定的。也就是說qsort()是一個不確定的排序算法。

? ? 2.2 compar參數

? ? ? ?compar參數指向一個比較兩個元素的函數。比較函數的原型應該像下面這樣,注意兩個形參必須是const void *型,同時在調用compar函數(compar實質為函數指針,這里稱它所指向的函數也為compar)時,傳入的實參也必須轉換成const void *型。在compar函數內部會將const void *型轉換成實際類型,見下文:

int compar(const void *p1, const void *p2);

? ?如果compar返回值小于0(<0),那么p2所指向元素會被排在p2所指向元素的前面

? ?如果compar返回值等于0(=0),那么p2所指向元素與p2所指向元素的順序不確定

? ?如果compar返回值大于0(>0),那么p1所指向元素會被排在p2所指向元素的后面

? ?因此,如果想讓qsort()進行從小到大(升序)排序,那么一個通用的compar函數可以寫成這樣:

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換成實際數組元素的類型。

? ? 2.3 一個使用qsort()函數的小例子

/* 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函數。如果a小于b,則返回值為負數(<0),也即a會排在b的前面。同理,若a大于b,則a會排在b的前面。所以,這里的qsort()為從小到大即升序排序。因此,運行結果為: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

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的qsort()函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。