二、qsort函式用法
總結qsort是c中自帶的快速排序函式,屬於標準庫,在做演算法題時會比較常用。
本文參考菜鳥教程。
void
qsort
(void
*base, size_t nitems, size_t size,
int(
*compar)
(const
void*,
const
void*)
)
base: 是指向要排序的陣列的第乙個元素的指標,其實就是要排序的陣列名;
nitems:表示待排序陣列中的元素個數;
size: 指數組中每個元素所佔的位元組長度,可以用sizeof獲得;
compar:用來比較兩個元素的函式,返回值是int型別,輸入的是兩個可以指向任何資料型別(void*)的指標,但它們指向的值必須是常量(const)。
(可以看到,函式宣告中的compar是乙個函式指標的形式,因此可以直接將比較函式作為引數傳入)
int
compar
(const
void
*a,const
void
*b);
compar函式的兩個輸入a,b其實代表,指向待排序陣列中的兩個元素的指標。qsort的排序原則是由compar函式返回值決定的。
如果 compar 返回值小於 0(< 0),那麼 a 所指向元素會被排在b所指向元素的前面;如果 compar 返回值等於 0(= 0),那麼 a 所指向元素與 b 所指向元素的順序不確定;如果 compar 返回值大於 0(> 0),那麼 a 所指向元素會被排在 b 所指向元素的後面。
舉個栗子:
// 待排序陣列values
int values=
;//定義比較函式
int cmpfunc (
const
void
* a,
const
void
* b)
(int*)a是對a進行型別轉換,使它變為指向原陣列中某個元素的指標;原陣列元素都是int型,因此a應該變為(int *)。再在前面加*取值。
可以看到在上面這個cmpfunc函式中,當a指向的值大於b指向值時,會返回大於0的數,按照前面的規則,返回值》0,就把a排到b後面。
因此這個函式定義的排序規則,是將values中元素公升序排序。
在對陣列排序時,可能會出現陣列中的元素也是乙個陣列,我們想要按照陣列元素的第乙個元素排序。這個在python中很容易實現:
nums =
sorted
(nums, key=
lambda x: x[0]
)
通過使用lambda對key進行賦值。在c中,compar函式就相當於自定義了lambda,我們同樣可以實現上面的效果。
定義compar函式為:
// 待排序陣列
int*news[numssize]
;for
(int i=
0; i)// 定義比較函式
intcompar
(const
void
* a,
const
void
* b)
我們定義待排序陣列的每個元素都是乙個陣列,現在想要根據元素的第一維進行公升序排序。
那麼compar函式中,a的型別應該是(int **),這是因為此時待排序陣列中的元素是(int *)型別(整型陣列)的。在前面加了*後,我們可以獲取a指向的那個長度為2的陣列。
由於我們想要根據元素的第乙個值排序,所以用(*(int**)a)[0]取出第乙個值進行比較。
可以看到,在對a進行資料型別轉換時,只需要明確待排序陣列元素的資料型別,再在此基礎上加個*表示指標就行。
比如對字元陣列排序,就是:
int
compar
(const
void
*a,const
void
*b)
其他一些可以參考博文。
qsort函式需要注意的是compar的構造;compar中對輸入值的型別轉換,以及輸出值對排序規則的含義很重要!
C語言 qsort函式
c程式使用標準庫函式qsort排序整數檔案 include include include include define max 10 int int cmp const void a,const void b int main while feof fp length fclose fp qsor...
C語言qsort函式詳解
qsort函式是ansi c標準中提供的,其宣告在stdlib.h檔案中,是根據二分發寫的,其時間複雜度為n log n 其結構為 void qsort void base,size t nelem,size t width,int comp const void const void 其中 bas...
C語言解讀qsort函式
c語言中有乙個快速排序的標準庫函式 qsort 在stdlib.h 中宣告。定義如下 void qsort void base,int nelem,unsigned int width,int pfcompare const void const void 引數解讀 base是待排序陣列的起始位址 ...