最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言庫(kù)函數(shù)qsort及bsearch快速排序算法使用解析

 更新時(shí)間:2022年02月14日 11:32:05   作者:?jiǎn)虇碳业凝堼? 
這篇文章主要為大家介紹了C語(yǔ)言庫(kù)函數(shù)qsort及bsearch快速排序算法的使用示例解析

qsort

qsrot 就是C語(yǔ)言庫(kù)函數(shù)中的快速排序函數(shù),對(duì)數(shù)組,結(jié)構(gòu)體都可以實(shí)現(xiàn)快速排序, 他在頭文件<stdlib.h>中使用,聲明格式為:

void qsort(void* base, size_t nums, size_t size, int (*compare)(const void *, const void*))

這么煩人一長(zhǎng)串的參數(shù)各是什么意思呢,base 是指向要排序的數(shù)組的第一個(gè)元素的指針。nums是由 base 指向的數(shù)組中元素的個(gè)數(shù)。size 是數(shù)組中每個(gè)元素的大小,以字節(jié)為單位。compare 是用來比較兩個(gè)元素的函數(shù),這個(gè)比較函數(shù)需要我們自己補(bǔ)全。

含義

void*代表著任意類型的數(shù)組,這個(gè)數(shù)組也就是我們想用來排序的對(duì)象數(shù)組;size_t 在系統(tǒng)里面被定義成 int 類型的,所以我們可以把 size_t修飾的數(shù)默認(rèn)為一個(gè)整數(shù)。

為什么要細(xì)化出數(shù)組大小和元素大???這和我排序有毛關(guān)系?其實(shí)這是為了區(qū)分不同類型的數(shù)組,int 和 char 類型的數(shù)組每個(gè)元素所占空間就不一樣,自然要區(qū)別開。

int main()
{
	int arr[6] = { 1,4,5,8,2,3};
	qsort(arr, 6, sizeof(arr[0]), compare);
}

最后的 compare 函數(shù)我是直接將這個(gè)元素作為參數(shù)傳進(jìn)來,那么問題來了,這個(gè)比較函數(shù)怎么寫?

我們根本不用管那個(gè) *compare 的指針什么鬼,他就相當(dāng)于告訴你這里在用一個(gè)外部函數(shù),我們只要明白整個(gè)函數(shù)名兒上去就是妥妥的了,這個(gè)函數(shù)名不一定就叫 compare ,諸君自便。

實(shí)現(xiàn)

后面的(const void , const void)自然就是這個(gè)函數(shù)的參數(shù)了,兩個(gè) void* 實(shí)際運(yùn)用的時(shí)候就看成 a ,b,既然是外部函數(shù)我們就要自己動(dòng)手了,我們的最終目的是為了排序,比較函數(shù)就應(yīng)該實(shí)現(xiàn)數(shù)組元素大小的比較,本質(zhì)上說就是在比較 a和b 的大小,而a,b是我數(shù)組中任意的兩兩元素。

那首先要做的就是把這個(gè)不知道什么類型的 void 指針變成我們給定的,之前代碼中給的是整型數(shù)組,這里就要對(duì)應(yīng)變成整型指針,這兩個(gè)指針指向數(shù)組中的兩個(gè)整數(shù),既然要比較,我們就直接做減法看正負(fù)即可,把這兩個(gè)指針轉(zhuǎn)換成真正的整數(shù)后就大功告成了:

	int* p = (int*)a;
	int* q = (int*)b;
	int c = *p;
	int d = *q;

成品如下:

#include<stdlib.h>
int compare(const void* a,const void* b)
{
	int* p = (int*)a;
	int* q = (int*)b;
	int c = *p;
	int d = *q;
	return c - d;
}
int main()
{
	int i = 0;
	int arr[6] = { 1,4,5,8,2,3 };
	qsort(arr, 6, sizeof(arr[0]), compare);
	for (i = 0; i < 6; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

結(jié)果如下

在這里插入圖片描述

結(jié)構(gòu)體的排序也是同理,如下:

#include<stdlib.h>
int compare(const void* a,const void* b)
{
	int* p = (int*)a;
	int* q = (int*)b;
	int c = *p;
	int d = *q;
	return c - d;
}
int main()
{
	int i = 0;
	int arr[6] = { 1,4,5,8,2,3 };
	qsort(arr, 6, sizeof(arr[0]), compare);
	for (i = 0; i < 6; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

結(jié)果就是根據(jù)結(jié)構(gòu)體中 a 成員大小來排的:

在這里插入圖片描述

格局打開

1.上面是實(shí)現(xiàn)從小到大排列,要實(shí)現(xiàn)從大到小排只需 return d - c 即可。
2.如果是比較浮點(diǎn)數(shù),注意在兩個(gè)數(shù)相差不大時(shí),介于(-1,1),因?yàn)楝F(xiàn)在是整型指針,返回值也是整型,return 回來的就是個(gè) 0,造成無(wú)意義操作,怎么處理呢?很簡(jiǎn)單,改成如下即可:

int compare(const void* a,const void* b)
{
	int* p = (int*)a;
	int* q = (int*)b;
	int c = *p;
	int d = *q;
	if(c - d<0)
	{
	return -1;
	}
	else
	{
	return 1;
	}
}

bsearch

bsearch (binary search)也是C語(yǔ)言庫(kù)函數(shù),功能是執(zhí)行二分查找,聲明定義如下

void *bsearch(const void *key, const void *base, size_t nums, size_t size, int (*compar)(const void *, const void *))

和 qsort 一樣是又臭又長(zhǎng),且隨我慢慢看,key 是指向要查找的元素的指針,類型轉(zhuǎn)換為 void*,其他的和 qsort 里的是一樣的不再贅述。

強(qiáng)調(diào)一下,bsearch()的使用有一個(gè)硬性要求,這個(gè)數(shù)組必須要有順序性,從大到小或從小到大否則達(dá)咩,所以建議和 qsort 配套實(shí)驗(yàn)更佳。

這個(gè) key 就是我們的查找目標(biāo),void* 代表著一個(gè)指針,所以我們?cè)诤瘮?shù)里面是不能直接給出的 key 的值,那我們就取他對(duì)應(yīng)的地址就行

	int key = 5;
	bsearch(&key,arr,6,sizeof(int),compare1);

接下來順?biāo)浦垓?yàn)證一下:

 judge = (int*) bsearch (&key, values, 5, sizeof (int), cmpfunc);
   if( judge != NULL ) 
   {
      printf("find %d is true\n", *judge);
   }
   else 
   {
      printf("%d can not be found\n", *judge);
   }
   
   return(0);
}

整個(gè)代碼如下:

#include<stdlib.h>
int compare(const void* a, const void* b)
{
	int* p = (int*)a;
	int* q = (int*)b;
	int c = *p;
	int d = *q;
	return c - d;
}
int compare1(const void* key, const void* a)
{
	return (*(int*)key-*(int*)a);
}
int main()
{
	int* judge;
	int arr[6] = { 1,4,5,8,2,3 };
	qsort(arr, 6, sizeof(arr[0]), compare);
	int key = 5;
	judge = (int*)bsearch(&key, arr, 5, sizeof(int), compare1);
	if (judge != NULL)
	{
		printf("find %d is true\n", *judge);
	}
	else
	{
		printf("%d can not be found\n", *judge);
	}

	return(0);
}

在這里插入圖片描述

今天就先到這里吧,摸了家人們,更多關(guān)于C語(yǔ)言庫(kù)函數(shù)qsort及bsearch快速排序算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解C++中vector的理解以及模擬實(shí)現(xiàn)

    詳解C++中vector的理解以及模擬實(shí)現(xiàn)

    vector是表示可變大小數(shù)組的序列容器。這篇文章主要為大家詳細(xì)介紹了vector的理解以及模擬實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-03-03
  • C語(yǔ)言三種方法解決輪轉(zhuǎn)數(shù)組問題

    C語(yǔ)言三種方法解決輪轉(zhuǎn)數(shù)組問題

    這篇文章主要給大家講解輪轉(zhuǎn)數(shù)組的問題,一個(gè)問題不局限于一種解法,希望你看了本文的解決方法以后可以舉一反三自己編寫,這樣你的技術(shù)水平會(huì)有質(zhì)的提高
    2022-04-04
  • C++中auto類型說明符詳解(附易錯(cuò)實(shí)例)

    C++中auto類型說明符詳解(附易錯(cuò)實(shí)例)

    這篇文章主要給大家介紹了關(guān)于C++中auto類型說明符的相關(guān)資料,文中還附易錯(cuò)實(shí)例,在C++11中引入了auto類型說明符,用它就能讓編譯器替我們?nèi)シ治霰磉_(dá)式所屬的類型,需要的朋友可以參考下
    2023-07-07
  • C語(yǔ)言、C++中的union用法總結(jié)

    C語(yǔ)言、C++中的union用法總結(jié)

    這篇文章主要介紹了C語(yǔ)言、C++中的union用法總結(jié),本文講解了什么是union、C中使用union、當(dāng)union遇到對(duì)象等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • C語(yǔ)言學(xué)習(xí)筆記之VS2022安裝使用教程

    C語(yǔ)言學(xué)習(xí)筆記之VS2022安裝使用教程

    這篇文章主要介紹了C語(yǔ)言學(xué)習(xí)筆記之VS2022安裝使用教程,在VS2022中,在使用scanf函數(shù)編譯出錯(cuò),本文給大家提到了解決方法,需要的朋友可以參考下
    2022-05-05
  • C語(yǔ)言實(shí)現(xiàn)返回字符串函數(shù)的四種方法

    C語(yǔ)言實(shí)現(xiàn)返回字符串函數(shù)的四種方法

    在C語(yǔ)言中實(shí)現(xiàn)函數(shù)返回字符串,首先要確定函數(shù)返回的字符串地址的來源,一般分為四種方式,下面這篇文章就給大家通過示例代碼詳細(xì)介紹這幾種方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • C++動(dòng)態(tài)內(nèi)存分配超詳細(xì)講解

    C++動(dòng)態(tài)內(nèi)存分配超詳細(xì)講解

    給數(shù)組分配多大的空間?你是否和初學(xué)C時(shí)的我一樣,有過這樣的疑問。這一期就來聊一聊動(dòng)態(tài)內(nèi)存的分配,讀完這篇文章,你可能對(duì)內(nèi)存的分配有一個(gè)更好的理解
    2022-08-08
  • MFC實(shí)現(xiàn)連連看游戲之地圖顯示

    MFC實(shí)現(xiàn)連連看游戲之地圖顯示

    這篇文章主要為大家詳細(xì)介紹了MFC實(shí)現(xiàn)連連看游戲之地圖顯示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫運(yùn)行C、C++的教程詳解(Windows)【真正的小白版】

    Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫運(yùn)行C、C++的教程詳解(Windows

    這篇文章主要介紹了Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫運(yùn)行C、C++的教程詳解(Windows)【真正的小白版】,圖文詳解介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C++實(shí)現(xiàn)LeetCode(118.楊輝三角)

    C++實(shí)現(xiàn)LeetCode(118.楊輝三角)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(118.楊輝三角),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

大英县| 黄骅市| 读书| 西乌珠穆沁旗| 广宁县| 潍坊市| 册亨县| 沁水县| 苏尼特右旗| 巴中市| 布拖县| 大悟县| 疏勒县| 嘉善县| 北票市| 宁河县| 类乌齐县| 图木舒克市| 浏阳市| 通海县| 永泰县| 安图县| 府谷县| 昌宁县| 五河县| 苗栗市| 陇西县| 疏勒县| 枣庄市| 奇台县| 天全县| 磐安县| 林芝县| 望都县| 湄潭县| 绥化市| 长治县| 贵州省| 高阳县| 分宜县| 车险|