C語言qsort 函式的使用

2022-06-26 05:57:11 字數 2043 閱讀 2553

qsort()函式是 c 庫中實現的快速排序演算法,包含在stdlib.h標頭檔案中,其時間複雜度為 o(nlogn)。函式原型如下:

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

此函式需要四個引數。

第乙個引數是需要排序的陣列的基位址,因為是void *型別,所以此函式可以給任何型別的陣列進行排序;

第二個引數是待排序的數量(size_t 是一種特別的資料型別,可以近似理解為 int 型);

第三個是單個陣列元素的大小,即位元組數,例如 int 型就是 4 或者sizeof(int)(sizeof 的返回值型別就是sizeof),char 型就是 1 或者

sizeof(char)。因為為了適用於各種資料結構,第乙個引數將指向陣列的指標強轉成了void *型別,也即此時函式並不知道將要進行排序的陣列內儲存的是什麼元素,因此我們需要顯式地告訴它單個元素所佔的長度;

第四個引數是乙個指向函式的指標,其作用是規定排序的規則,即按照什麼樣的方式進行排序。

下面我們對乙個整型陣列排序為例:

#include#include//比較函式原型 

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

int main() ;

qsort(num, 10, sizeof(int), mycmp);

for(int i=0; i<10; i++)

printf("%d ", num[i]);

printf("\n");

return 0;

}//比較函式

int mycmp(const void* p1, const void* p2)

執行結果如下所示:

使用qsort最重要的是比較函式的編寫。

首先,qsort函式的原型中已經對此元素的原型有了明確的規定:int (*compar)(const void *, const void *),需要傳入指向兩個元素的指標。

與上文增加第三個引數的原因相同,比較函式的引數指標是void *型別,這個引數同樣不知道元素實際的大小,因此我們需要進行型別的強轉,轉換成元素實際型別對應的指標,例如上文中為了給乙個int型陣列排序:

const int * a = (const int *) p1;

const int * b = (const int *) p2;

然後,兩個元素之間的比較結果無非 > 、= 、< ,我們要給希望成立的結果返回 1,例如:如果希望從小到大排列,則*a < *b成立時返回 1;如果希望從大到小排列,則*a > *b返回 1,相應的*a == *b返回 0,*a < *b返回 -1.

因此如果將上述程式的 1 和 -1 顛倒位置,結果就會變成降序排列:

因為可以任意編寫比較函式,當比較具有優先順序時我們也可以從容解決。

例如:定義了這樣乙個表示時間的結構體:

struct time ;
如果對此型別的陣列元素進行公升序排列,那麼比較函式應該為:

int mycomp(const void * p1, const void * p2)	}	

return value;

}

C語言qsort函式的使用

qsort函式必須是對於連續的記憶體的資料進行排序,不能對鍊錶進行排序 定義 qsort 基本快速排序的方法,每次把陣列分成兩部分和中間的乙個劃分值,而對於有多個重複值的陣列來說,基本快速排序的效率較低,且不穩定 整合在c語言庫函式裡面的qsort函式,使用三路劃分的方法解決排序這個問題。所謂三路劃...

qsort函式的使用 C語言

qsort函式是一種可以實現多種型別資料比較的函式,可int,可float,可double等等 void qsort void base,int nelem,int width,int fcmp const void const void 函式引數介紹 1,要比較的陣列的位址,2.陣列的個數,3.陣...

C語言qsort函式的使用

函式原型 void qsort void base,int nelem,int width,int fcmp const void const 標頭檔案 include base 要排序的陣列 nelem 需要排序的長度 width 每個陣列元素的大小 cmp 比較函式 int型別的排序 int c...