C語言排序函式和二分查詢呼叫方法

2021-09-07 03:38:28 字數 3409 閱讀 1594

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語言 二分查詢

二分查詢有序陣列中查詢具體某個數 條件 陣列為有序陣列 公升序或降序 查詢的思想 在有序陣列中查詢具體某個數,如果有,輸出該數所對應的下標 如果沒有,輸出未找到.具體思想 若為公升序排列的陣列,取陣列中間元素與待查詢的數比較,若待查詢的數小於中間元素,則在陣列左半部分查詢 若待查詢的數大於中間元素,...