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

一文帶你學(xué)會(huì)C語(yǔ)言中的qsort函數(shù)

 更新時(shí)間:2022年12月21日 08:53:38   作者:暢游星辰大海  
qsort函數(shù)是C語(yǔ)言的庫(kù)函數(shù),能實(shí)現(xiàn)對(duì)各種元素類型的比較,使用的基本思想是快速排序法,頭文件是<stdlib.h>,本文不講解具體實(shí)現(xiàn)原理,只對(duì)使用方法進(jìn)行說(shuō)明,希望對(duì)大家有所幫助

鋪墊知識(shí)

qsort函數(shù)

參數(shù)類型    

void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));

參數(shù)類型解釋

  • 參數(shù)1 待排序數(shù)組首元素的地址
  • 參數(shù)2 數(shù)組內(nèi)元素個(gè)數(shù)
  • 參數(shù)3 數(shù)組內(nèi)每個(gè)元素大小,單位是字節(jié)
  • 參數(shù)4 函數(shù)指針,由自己實(shí)現(xiàn),內(nèi)容是兩個(gè)元素的比較方法

void* 

參數(shù)1和參數(shù)4中的void*無(wú)類型的指針,能夠接受各種類型的參數(shù),這樣的話,我們就能傳各種類型的參數(shù)

void*的注意事項(xiàng)    

由于void是無(wú)類型指針,所以

1、void類型指針不能進(jìn)行加減整數(shù)的操作(不知道步長(zhǎng))

2、不能進(jìn)行解引用操作,

3、想要進(jìn)行這些操作,需要把void類型強(qiáng)制類型轉(zhuǎn)成所需要的類型才能操作,例如(int*)e1,就將void*類型的e1轉(zhuǎn)換為int*

使用qsort函數(shù)進(jìn)行整型數(shù)組的排序

在自己完成的in_cmp函數(shù)中,給出的是兩個(gè)元素的比較方法

  • 正序排序時(shí),e1>e2,返回大于0的數(shù),e1==e2,返回0,e1<e2,返回小于0的數(shù)
  • 逆序排序時(shí),e1>e2,返回小于0的數(shù),e1==e2,返回0,e1<e2,返回大于0的數(shù)

當(dāng)然,我們可以用強(qiáng)制類型轉(zhuǎn)換后,就知道了步長(zhǎng),使用減法來(lái)比較e1和e2的大小

#include<stdio.h>
#include<stdlib.h> 
int int_cmp(const void* e1,const void* e2)
{
    if(*(int*)e1 > *(int*)e2 )//先強(qiáng)制類型轉(zhuǎn)換,在解引用進(jìn)行比較
       return 1;
    else if(*(int*)e1 == *(int*)e2 )
       return 0;
    else 
       return -1;
}
int main()
{
    int i=0;
    int arr[10]={1,4,0,5,8,9,2,3,6,7};
    int sz=sizeof(arr)/sizeof(arr[0]);
    qsort(arr,sz,sizeof(arr[0]),int_cmp);
    for(i=0;i<sz;i++)
       printf("%d ",arr[i]);
    return 0;
}

使用qsort函數(shù)進(jìn)行浮點(diǎn)型數(shù)組的排序

#include<stdio.h>
#include<stdlib.h> 
int float_cmp(const void* e1,const void* e2)
{
    return *(float*)e1 - *(float*)e2;
}
int main()
{
    int i=0;
    float arr[5]={1.0,3.5,2.2,7.3,5.5};
    int sz=sizeof(arr)/sizeof(arr[0]);
    qsort(arr,sz,sizeof(arr[0]),float_cmp);
    for(i=0;i<sz;i++)
       printf("%.1f ",arr[i]);
    return 0;
}

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

以學(xué)生信息結(jié)構(gòu)體為例,結(jié)構(gòu)體包括學(xué)生名字和學(xué)生年齡

以名字為基準(zhǔn)進(jìn)行比較

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
struct student
{
    char name[10];
    int age;
};
 
//以名字來(lái)對(duì)結(jié)構(gòu)體進(jìn)行排序
int struct_cmp_byname(const void* e1, const void* e2)
{
    return strcmp(((struct student*)e1)->name, ((struct student*)e2)->name);
}
 
int main()
{
    int i=0;
    struct student stu[3] = { {"張三",20},{"李四",19},{"王五",18}};
    int sz = sizeof(stu) / sizeof(stu[0]);
    qsort(stu, sz, sizeof(stu[0]), struct_cmp_byname);
    for (i = 0; i < sz; i++)
    {
        printf("%s %d\n", stu[i].name, stu[i].age);
    }
}

以年齡為基準(zhǔn)進(jìn)行比較 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
struct student
{
    char name[10];
    int age;
};
 
//以年齡來(lái)對(duì)結(jié)構(gòu)體進(jìn)行排序
int struct_cmp_byage(const void* e1, const void* e2)
{
    return ((struct student*)e1)->age - ((struct student*)e2)->age;
}
 
int main()
{
    int i=0;
    struct student stu[3] = { {"張三",20},{"李四",19},{"王五",18}};
    int sz = sizeof(stu) / sizeof(stu[0]);
    qsort(stu, sz, sizeof(stu[0]), struct_cmp_byage);
    for (i = 0; i < sz; i++)
    {
        printf("%s %d\n", stu[i].name, stu[i].age);
    }
}

到此這篇關(guān)于一文帶你學(xué)會(huì)C語(yǔ)言中的qsort函數(shù)的文章就介紹到這了,更多相關(guān)C語(yǔ)言 qsort函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實(shí)現(xiàn)回文串判斷的兩種高效方法

    C++實(shí)現(xiàn)回文串判斷的兩種高效方法

    文章介紹了兩種判斷回文串的方法:解法一通過(guò)創(chuàng)建新字符串來(lái)處理,解法二在原字符串上直接篩選判斷,兩種方法都使用了雙指針?lè)?文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • 減小VC6編譯生成的exe文件的大小的方法

    減小VC6編譯生成的exe文件的大小的方法

    這篇文章主要介紹了減小VC6編譯生成的exe文件的大小的方法,需要的朋友可以參考下
    2015-01-01
  • C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)詳解

    C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)詳解

    大家好,本篇文章主要講的是C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C語(yǔ)言函數(shù)指針的老生常談

    C語(yǔ)言函數(shù)指針的老生常談

    這篇文章主要為大家介紹了vue組件通信的幾種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • C++實(shí)現(xiàn)路口交通燈模擬系統(tǒng)

    C++實(shí)現(xiàn)路口交通燈模擬系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)路口交通燈模擬系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++阻止類被實(shí)例化詳解

    C++阻止類被實(shí)例化詳解

    下面小編就為大家?guī)?lái)一篇淺談C++阻止類被實(shí)例化詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-09-09
  • C++ STL容器stack和queue詳解

    C++ STL容器stack和queue詳解

    這篇文章主要介紹了C++ STL容器stack和queue詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • c語(yǔ)言 兩字符串交叉合并實(shí)例

    c語(yǔ)言 兩字符串交叉合并實(shí)例

    今天小編就為大家分享一篇c語(yǔ)言 兩字符串交叉合并實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • C++?ASIO實(shí)現(xiàn)異步套接字管理詳解

    C++?ASIO實(shí)現(xiàn)異步套接字管理詳解

    Boost?ASIO(Asynchronous?I/O)是一個(gè)用于異步I/O操作的C++庫(kù),該框架提供了一種方便的方式來(lái)處理網(wǎng)絡(luò)通信、多線程編程和異步操作,本文介紹了如何通過(guò)ASIO框架實(shí)現(xiàn)一個(gè)簡(jiǎn)單的異步網(wǎng)絡(luò)套接字應(yīng)用程序,需要的可以參考下
    2023-08-08
  • C語(yǔ)言實(shí)現(xiàn)超市信息管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)超市信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)超市信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評(píng)論

黄龙县| 水富县| 南汇区| 五指山市| 永康市| 长岛县| 木里| 阿鲁科尔沁旗| 淄博市| 美姑县| 灵丘县| 孙吴县| 闵行区| 余干县| 平阴县| 象山县| 株洲县| 金乡县| 邛崃市| 荆州市| 大足县| 上犹县| 连城县| 伊春市| 柯坪县| 襄城县| 青岛市| 宿迁市| 扬州市| 双城市| 鹤庆县| 英德市| 梅河口市| 沭阳县| 永仁县| 界首市| 安新县| 日土县| 赣榆县| 易门县| 长治县|