日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

一文帶你學會C語言中的qsort函數_C 語言

作者:暢游星辰大海 ? 更新時間: 2023-01-21 編程語言

鋪墊知識

qsort函數

參數類型?? ?

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

參數類型解釋

  • 參數1 待排序數組首元素的地址
  • 參數2 數組內元素個數
  • 參數3 數組內每個元素大小,單位是字節
  • 參數4 函數指針,由自己實現,內容是兩個元素的比較方法

void*?

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

void*的注意事項?? ?

由于void是無類型指針,所以

1、void類型指針不能進行加減整數的操作(不知道步長)

2、不能進行解引用操作,

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

使用qsort函數進行整型數組的排序

在自己完成的in_cmp函數中,給出的是兩個元素的比較方法

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

當然,我們可以用強制類型轉換后,就知道了步長,使用減法來比較e1和e2的大小

#include<stdio.h>
#include<stdlib.h> 
int int_cmp(const void* e1,const void* e2)
{
    if(*(int*)e1 > *(int*)e2 )//先強制類型轉換,在解引用進行比較
       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函數進行浮點型數組的排序

#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函數進行結構體數組的排序

以學生信息結構體為例,結構體包括學生名字和學生年齡

以名字為基準進行比較

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
struct student
{
    char name[10];
    int age;
};
 
//以名字來對結構體進行排序
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);
    }
}

以年齡為基準進行比較?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
struct student
{
    char name[10];
    int age;
};
 
//以年齡來對結構體進行排序
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);
    }
}

原文鏈接:https://blog.csdn.net/m0_73222051/article/details/128390758

欄目分類
最近更新