void qsort(
void *base,
size_t n,
size_t size,
int (*compar)(const void *, const void *)
);
在使用時,使用者需要自己編寫乙個判斷兩個數(不僅限於數字)比較大小的方法;
比如簡單的判斷兩個數字的大小:
int num_comp(const int *a,const int *b)
注意函式的格式是不能變的,且第乙個引數》第二個引數,需要返回乙個正數.
在呼叫時,該如何呼叫呢?
如果有乙個陣列int num[100];
裡面是100個未排序的數字,要將這個陣列按公升序排列;
呼叫qsort函式:
qsort(num,100,sizeof(int),(int (*)(const void *,const void *))num_comp);
說明一下這裡的引數,
第乙個引數num是陣列名;
第二個引數100是說這個要排序的陣列大小num[0]到num[100-1];
第三個引數是排序的元素大小,這裡是int型別;
第四個是比較函式的指標,(int (*)(const void *,const void *))
是指標型別轉換;num_comp
是要比較函式的位址;
#include
#include
#include
using
namespace std;
intnum_comp
(const
int*a,
const
int*b)
;int
main()
;srand
(time(0
));//陣列初始化,填滿0-100隨機數;
for(
int i=
0;i<
100;i++
) num[i]
=rand()
%101
;//公升序排序;
qsort
(num,
100,
sizeof
(int),
(int(*
)(const
void*,
const
void*)
)num_comp)
;//輸出;
for(
int i=
0;i<
100;i++
) cout<<<
' ';
}int
num_comp
(const
int*a,
const
int*b)
如果想要進行降序排列,只需要修改return *a>*b?1:-1;
變成return *a<*b?1:-1;
即可.
c庫中提供了二分查詢函式,用於解決在已排序陣列中尋找乙個數字;
其函式原型是:
void *bsearch( const void *key, const void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );
引數說明:
1、key是要尋找的關鍵數字,傳入時以位址方式傳入;
2、buf是要尋找的陣列,傳入首位址;
3、num是陣列的元素個數,可以用巨集定**決;
4、size是陣列元素的大小;
5、比較函式;
呼叫方法:
需要使用者提供乙個比較函式,同上面快排的比較函式;
#include
#include
#include
using
namespace std;
#define size(x) sizeof(x)/sizeof(x[0])
//巨集定義陣列元素個數;
typedef
int(
*comp_p)
(const
void*,
const
void*)
;//定義指向比較函式的指標型別;
intnum_comp
(const
int*a,
const
int*b)
;int
main()
;srand
(time(0
));for
(int i=
0;i<
100;i++
) num[i]
=rand()
%101
;//公升序排列;
qsort
(num,
100,
sizeof
(int),
(int(*
)(const
void*,
const
void*)
) num_comp)
;//檢視已排序陣列;
for(
int i=
0;i<
100;i++
) cout<<<
' ';
//輸入要查詢的數字;
int number=5;
cin>>number;
//二分查詢;
int*p=
(int*)
bsearch
(&number,num,
size
(num)
,sizeof
(int),
(comp_p)num_comp)
;//列印查詢資料;
if(p!=
null
)else
cout<"not found"
<}int
num_comp
(const
int*a,
const
int*b)
需要注意的是,這裡定義了乙個指向比較函式的指標型別comp_p
,在傳入函式位址時,將函式型別轉換一下。
而且bsearch函式返回的不是要查詢數字在陣列中的索引,而是返回查詢到的數字的指標,因此需要定義乙個int *p
的指標來接收這個指標,如果沒有找到返回null
二分查詢和排序
二分查詢,主要是針對排序問題進行查詢 len sizeof a sizeof a 0 我們先設定 int left 0 int right len 1 int mid left right 2 如果k大於mid,那麼 left mid 1 小於 right mid 1 include int sea...
C語言 順序查詢和二分查詢
任務 順序查詢元素 include define size 10 int main int index 1 如果末尾沒有找到,預設函式為 1 int i,number printf 請輸入要查詢的資料 scanf d number 順序查詢 for i 0 i0 else return 0 二分查詢...
C語言 二分查詢
二分查詢有序陣列中查詢具體某個數 條件 陣列為有序陣列 公升序或降序 查詢的思想 在有序陣列中查詢具體某個數,如果有,輸出該數所對應的下標 如果沒有,輸出未找到.具體思想 若為公升序排列的陣列,取陣列中間元素與待查詢的數比較,若待查詢的數小於中間元素,則在陣列左半部分查詢 若待查詢的數大於中間元素,...