C C qsort函式的使用方法和細節

2022-01-29 03:54:02 字數 1693 閱讀 9187

qsort 為quick sort的簡寫,意為快速排序,主要用於對各種陣列的排序,在標頭檔案stdlib.h中。

因為陣列的元素可能是任何型別的,甚至是結構或者聯合,所以必須高數函式qsort如何確定兩個陣列元素哪乙個「更小」,這就需要我們給出比較的規則,即什麼算大,什麼算小。

通過編寫比較函式可以為函式qsort提供這些資訊。當給定兩個指向陣列元素的指標p和q時,比較函式必須返回乙個整數。如果*p小於*q,那麼返回的數為負數;如果*p等於*q,那麼返回0.如果*p大於*q,返回正數。

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

函式的形式引數從左到右分別為:

指向要排序陣列的第乙個元素的指標base(如果只是要對陣列的一段區域進行排序,那麼要是base指向這段區域的第乙個元素。)在一般情況下,base就是陣列的名字;

nmemb是要排序元素的數量(不一定是陣列中元素的數量);

size是每個陣列元素的大小,用位元組來衡量;

compar為指向比較函式的指標。

比較函式的實現是qsort函式能否正確實現的重點。

編寫比較函式並沒有想象中的那麼容易。函式qsort要求它的形式引數型別為void *,但我們不能通過void *型的指標訪問陣列的成員;我們需要指向要比較元素的型別的指標。為了解決這個問題,我們將在比較函式內部把p與q賦給相應對應型別的指標變數。由於常量指標不能賦值給變數。所以在宣告對應指標變數時應該加上const關鍵字。

下面是乙個比較整型陣列的比較函式的例子。

int compare(const void *p, const void *q)

當然除了把用const指標變數的方法,還可以使用強制型別轉換的方式來達到這個目的。

int compare(const void *p,const void *q)

還可以進一步精簡

int compare(const void *p,const void *q)

如果待比較的元素是指標(雖然我們一般不會比較指標的大小,但是我們經常需要對指標代表的空間比較大小,比如比較乙個字串陣列的大小,每個字串都由乙個指標代表),那麼比較函式的實現就比較麻煩了。

首先我們需要明確的是,比較函式中的兩個指標必須要指向需要比較的兩個元素。如果這兩個元素是指標而不是乙個實體,那麼這兩個指標應該是指向指標的指標。

這裡我們以乙個比較字串的比較函式舉例:

int compare(const void *p,const void *q)

昨天刷題的時候發現乙個和qsort有關的坑。

如果在寫cmp函式時使用return *(int *)p-*(int *)q;簡寫,而比較函式比較後返回的是乙個int值,這種寫法在比較元素是整型的時候沒有什麼問題,但是如果比較的元素是double時,那麼返回值可能和實際值不一樣了,例如如果兩個實型資料分別是1.1和1.0,返回的結果會變成0,這時函式qsort會把它們當成相同的元素。

此時正確的寫法應該是return *(double *)p>*(double *)q?1:0;

參考部落格:qsort函式排序各種型別的資料。

SQL 和VB TRIM 函式使用方法

sql 中的 trim 函式是用來移除掉乙個字串中的字頭或字尾。最常見的用途是移除字首或字尾的空白。這個函式在不同的資料庫中有不同的名稱 mysql trim rtrim ltrim oracle rtrim ltrim sql server rtrim ltrim 各種 trim 函式的語法如下 ...

split 和join 函式使用方法

split 和join 函式使用方法 函式的使用方法 1.join 功能是把字串或者列表,元組等的元素給連線起來 用法 join 單引號之間是你想要在隔開字元的符號,可以是字母,數字 空格等其他符號,另外,join括號裡只支援字串由字串組成的列表 字典,字串,元組 例子 string www gzi...

PHP callback函式使用方法和注意事項

在php中有些諸如 call user function 或 usort 的函式接受使用者自定義的函式作為乙個引數。callback 函式不僅可以是乙個簡單的函式,它還可以是乙個物件的方法,包括靜態類的方法。乙個 php 函式用函式名字串來傳遞。您可以傳遞任程式設計客棧何內建的或者使用者自定義的函式...