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

C語(yǔ)言中使用qsort函數(shù)對(duì)自定義結(jié)構(gòu)體數(shù)組進(jìn)行排序

 更新時(shí)間:2022年11月11日 11:41:16   作者:東方旅行者  
這篇文章主要介紹了C語(yǔ)言中使用qsort函數(shù)對(duì)自定義結(jié)構(gòu)體數(shù)組進(jìn)行排序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

使用qsort函數(shù)對(duì)自定義結(jié)構(gòu)體數(shù)組進(jìn)行排序

qsort進(jìn)行排序的數(shù)組存儲(chǔ)的不能是結(jié)構(gòu)體的指針,需要是結(jié)構(gòu)體本身。

結(jié)構(gòu)體

struct student{
? ? char* id;
? ? int mark;
}arr[4],
test0={"0001",80},
test1={"0002",90},
test2={"0003",60},
test3={"0004",61}
;

排序函數(shù)

int cmp(const void *a, const void *b){
? ? int mark1=((struct student *)a)->mark;
? ? int mark2=((struct student *)b)->mark;
? ? return mark1>mark2 ? 1:-1;
}

總體代碼

#include <stdio.h>
struct student{
? ? char* id;
? ? int mark;
}arr[4],
test0={"0001",80},
test1={"0002",90},
test2={"0003",60},
test3={"0004",61}
;
int cmp(const void *a, const void *b){
? ? int mark1=((struct student *)a)->mark;
? ? int mark2=((struct student *)b)->mark;
? ? return mark1>mark2 ? 1:-1;
}
int main(){
? ? arr[0]=test0;arr[1]=test1;arr[2]=test2;arr[3]=test3;
? ? printf("—————排序前—————\n");
? ? for(int i=0; i<4; i++)
? ? ? ? printf("%s %d\n",arr[i].id,arr[i].mark);
? ? qsort(arr,4,sizeof(struct student),cmp);
? ? printf("—————排序后—————\n");
? ? for(int i=0; i<4; i++)
? ? ? ? printf("%s %d\n",arr[i].id,arr[i].mark);
? ? return 0;
}

結(jié)果

—————排序前—————
0001 80
0002 90
0003 60
0004 61
—————排序后—————
0003 60
0004 61
0001 80
0002 90

C語(yǔ)言 qsort()函數(shù)詳解

1、qsort概念介紹

qsort()函數(shù)(quick sort)是八大排序算法中的快速排序,能夠排序任意數(shù)據(jù)類型的數(shù)組其中包括整形,浮點(diǎn)型,字符串甚至還有自定義的結(jié)構(gòu)體類型。

2、qsort()函數(shù)實(shí)現(xiàn)(循序漸進(jìn)式講解)

2.1 qsort()函數(shù)

qsort()函數(shù)函數(shù)函數(shù)參數(shù):

void qsort?
(void* base //待排序數(shù)據(jù)的起始地址
?size_t num, //待排序數(shù)據(jù)的元素個(gè)數(shù)
?size_t size,//待排序數(shù)據(jù)中一個(gè)元素的大小(單位:字節(jié))
?int (*compar)(const void*,const void*)//比較兩個(gè)元素大小的函數(shù)指針
);

函數(shù)中第一個(gè)函數(shù)參數(shù)(void)的類型非常奇妙,因?yàn)榇判驍?shù)據(jù)的元素類型可能是整形、浮點(diǎn)型、字符型、結(jié)構(gòu)體……而void類型就像一個(gè)宰相(宰相肚子能撐船)不管你傳過(guò)來(lái)的地址是何類型,我都可以積極的收納。

函數(shù)中第四個(gè)函數(shù)參數(shù)是最難理解的。對(duì)于整形數(shù)據(jù)我們可以通過(guò)大小號(hào)來(lái)比較,對(duì)于字符型數(shù)據(jù)可以用strcmp來(lái)比較,但是,我們遇到結(jié)構(gòu)體就出現(xiàn)了問(wèn)題,結(jié)構(gòu)體中包含的類型多,我們就需要因材施教。

 int (*compar)(const void*p1,const void*p2)//比較兩個(gè)元素大小的函數(shù)指針
);
返回值含義
return -1p1<p2
return 0p1=p2
return 1p1>p2

2.2 qsort()函數(shù)實(shí)現(xiàn)過(guò)程

觀察冒牌排序:

可得出如下過(guò)程:

整形:

//測(cè)試qsort()函數(shù)功能
int cmp_int(const void* e1, const void* e2)
{
?? ?return ?*(int*)e1 - *(int*)e2;
}
void test()
{
?? ?int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
?? ?int sz = sizeof(arr) / sizeof(arr[0]);
?? ?qsort(arr, sz, sizeof(arr[0]), cmp_int);
?? ?for (int i = 0; i < sz; i++)
?? ?{
?? ??? ?printf("%d ", arr[i]);//打印排列好的數(shù)組
?? ?}
}
?
int main()
{
?? ?
?? ?test();
?? ?
?? ?return 0;
}

結(jié)構(gòu)體:

struct Stu
{
?? ?char name[20] = {0};
?? ?int age = 0;
};
int cmp_by_name(const void* e1, const void* e2)
{
?? ?return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
void test()
{
?? ?struct Stu s[] = { {"zhangsan",10},{"lishi",20}};
?? ?qsort(s, sizeof(s), sizeof(s->name),cmp_by_name);
?? ?printf("%s ", s->name);
}
?
int main()
{
?? ?
?? ?test();
?? ?
?? ?return 0;
}

3、小結(jié)

有了qsort()函數(shù)能有節(jié)省不少時(shí)間,后期我會(huì)出一起通訊錄再詳細(xì)的介紹qsort()函數(shù)的使用。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語(yǔ)言應(yīng)用領(lǐng)域分析

    C語(yǔ)言應(yīng)用領(lǐng)域分析

    在本篇文章里小編給各位分享的是關(guān)于C語(yǔ)言應(yīng)用領(lǐng)域分析內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • C++淺析序列數(shù)據(jù)封裝與優(yōu)化實(shí)現(xiàn)方法

    C++淺析序列數(shù)據(jù)封裝與優(yōu)化實(shí)現(xiàn)方法

    封裝是面向?qū)ο缶幊讨械陌褦?shù)據(jù)和操作數(shù)據(jù)的函數(shù)綁定在一起的一個(gè)概念,這樣能避免受到外界的干擾和誤用,從而確保了安全,數(shù)據(jù)封裝是一種把數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)捆綁在一起的機(jī)制,數(shù)據(jù)抽象是一種僅向用戶暴露接口而把具體的實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái)的機(jī)制
    2022-12-12
  • 一文詳解C語(yǔ)言中文件相關(guān)函數(shù)的使用

    一文詳解C語(yǔ)言中文件相關(guān)函數(shù)的使用

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中文件相關(guān)函數(shù)的使用,可以實(shí)現(xiàn)文件的讀寫、打開(kāi)和關(guān)閉。文中通過(guò)示例進(jìn)行了詳細(xì)介紹,需要的可以參考一下
    2022-07-07
  • Qt實(shí)現(xiàn)密碼框

    Qt實(shí)現(xiàn)密碼框

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)密碼框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++基于文件流與armadillo讀取mnist示例詳解

    C++基于文件流與armadillo讀取mnist示例詳解

    這篇文章主要給大家介紹了關(guān)于C++基于文件流與armadillo讀取mnist的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 獲取當(dāng)前系統(tǒng)本地時(shí)間,精確到毫秒的實(shí)例

    獲取當(dāng)前系統(tǒng)本地時(shí)間,精確到毫秒的實(shí)例

    下面小編就為大家?guī)?lái)一篇獲取當(dāng)前系統(tǒng)本地時(shí)間,精確到毫秒的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • 使用VC++實(shí)現(xiàn)打印乘法口訣表

    使用VC++實(shí)現(xiàn)打印乘法口訣表

    本文給大家分享的是一個(gè)超級(jí)簡(jiǎn)單的小例子,使用vc++打印乘法口訣表,給需要的小伙伴參考下吧。
    2015-03-03
  • C語(yǔ)言回溯法解八皇后問(wèn)題(八皇后算法)

    C語(yǔ)言回溯法解八皇后問(wèn)題(八皇后算法)

    這篇文章介紹了C語(yǔ)言回溯法解八皇后問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • C語(yǔ)言運(yùn)算符與表達(dá)式

    C語(yǔ)言運(yùn)算符與表達(dá)式

    這篇文章主要介紹了C語(yǔ)言運(yùn)算符與表達(dá)式,表達(dá)式是C語(yǔ)言的主體。在C語(yǔ)言中,表達(dá)式由操作符和操作數(shù)組成,更多相關(guān)介紹需要的小伙伴可以參考下面文章內(nèi)容
    2022-07-07
  • Clion下vcpkg的使用詳解

    Clion下vcpkg的使用詳解

    這篇文章主要介紹了Clion下vcpkg的使用詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04

最新評(píng)論

绍兴县| 浠水县| 平阴县| 新和县| 高平市| 阿图什市| 浙江省| 磴口县| 东港市| 紫阳县| 鹤庆县| 金沙县| 利川市| 邢台县| 北流市| 麻城市| 阿荣旗| 色达县| 灵川县| 通化县| 安多县| 郓城县| 读书| 饶平县| 绥化市| 谷城县| 新和县| 厦门市| 潮安县| 革吉县| 万全县| 包头市| 德兴市| 新营市| 阿拉善左旗| 石台县| 嘉鱼县| 巩义市| 江西省| 普兰店市| 永新县|