C qsort 使用陷阱

2022-03-22 13:23:15 字數 1833 閱讀 7305

我相信使用stl提供的排序介面比自己實現排序演算法更高效,也更具有通用性,能節省**,而且對所有種類的資料的排序函式都是qsort,也提高了**的可讀性。在今天的工作中,qsort卻把我折騰了一番,我犯了個小錯誤,在程式設計領域,小錯誤可以導致大後果,事後寫了針對qsort的測試程式,如下:

qsorttest.cpp

1

#include

<

stdlib.h

>

2#include

<

string

.h>

3#include

<

stdio.h

>45

#include

<

iostream

>

6using

namespace

std;78

intcompare(

const

void

*arg1,

const

void

*arg2 );910

intmain()11;

13int

ncount

=sizeof

(arrtest)

/sizeof

(int

);14

15cout

<<

"before sort:";

16for

(inti=

0;i<

ncount;i++)

17cout

<<

arrtest[i]

<

;18cout

<<

endl;

1920

qsort(arrtest,

sizeof

(arrtest)

/sizeof

(int

),sizeof

(int

),compare);

2122

cout

<<

"after sort:";

23for

(inti=

0;i<

ncount;i++)

24cout

<<

arrtest[i]

<

;25cout

<<

endl;

26return0;

27}28int

compare(

const

void

*arg1,

const

void

*arg2 )

2934

3536

輸出結果截圖:

很明顯,輸出的結果排序錯誤。這個簡單的程式,很快就可以定位錯誤在compare函式上,今天在工作中除錯卻並非如此簡單,需要排序的是個結構體,排序前後還有數百行**,當時除錯了乙個多小時之後才將錯誤定位到compare上面。

仔細檢視msdn,發現qsort函式需要的compare函式要返回三個值:負值,0,正值。

趕緊:將compare函式修正如下:

1

intcompare(

const

void

*arg1,

const

void

*arg2 )

2

檢視輸出,問題解決了,

仔細想想,用減法操作結果作為返回值只能適合整型比較,如果是浮點型的話,還是有問題的:返回值是整型,如果兩個數大小是0.5,則compare函式會得到0.

以後用標準庫函式,一定要仔細閱讀msdn!

C qsort和sort的區別

first qsort 基本快速排序的方法,每次把陣列分成兩分和中間的乙個劃分值,而對於有多個重複值的陣列來說,基本排序的效率較低。整合在c語言庫函式裡面的的qsort函式,使用 三 路劃分的方法解決這個問題。所謂三路劃分,是指把陣列劃分成小於劃分值,等於劃分值和大於劃分值的三個部分。函式對buf ...

bstr t使用陷阱

在使用的時候我們可以定義乙個變數 bstr t strtest 然後會這樣賦值 或者使用寬字元的形式 strtest strtest test 然後我們有另外的字串類,比如stl中wstring,我們定義乙個變數wstring stlstr 然後通過賦值操作stlstr strtest將strtes...

ios 記憶體使用陷阱

在iphone開發過程中,中的記憶體洩露我們很容易用記憶體檢測工具leaks 檢測出來,並一一改之,但有些是因為ios 的缺陷和用法上的錯誤,leaks 檢測工具並不能檢測出來,你只會看到大量的記憶體被使用,最後收到didreceivememorywarning,最終導致程式崩潰。以下是開發過程中遇...