我相信使用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,最終導致程式崩潰。以下是開發過程中遇...