C語言小知識 qsort函式

2021-10-25 05:54:37 字數 2345 閱讀 2035

二、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是待排序陣列的起始位址 ...