C语言sort()函数的使用 详细介绍

这篇具有很好参考价值的文章主要介绍了C语言sort()函数的使用 详细介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

qsort()函数(quick sort)是快速排序算法,可以排序任意数据类型的数组其中就包括整形,浮点型,字符串甚至自定义的结构体类型。

下图是4个参数的含义

 qsort(void *__base, size_t __nel, size_t __width,int (* _Nonnull __compar)(const void *, const void *));

1. void*base     (首元素地址)

我们要排序一个数组,首先要知道从哪儿开始排序,所以先把首元素地址传给qsort函数。 

2.size_t nell     (元素个数)

我们还要知道数组从哪里结束,但是由于排序的不确定性我们不清楚最后的元素地址,所以将元素个数传入qsort函数。

3.size_t width  (元素字节大小)

我们知道qsort函数可以排序任意类型的一组数据,因此我们采用void*类型的指针接收元素,但是void*类型的指针不能进行加减操作,也就无法移动。

那么在函数内部又是怎样操作变量的呢?

我们可以将void*类型的指针强制类型转换char*类型的指针后来操作元素。因为char*类型的指针移动一次的单位是一个字节,因此得知要操作的元素字节大小时,就可以让char*类型的指针移动该个字节到下一个元素,指针就可以指向那个元素了。

4.int (* _Nonnull __compar)(const void *, const void *))(比较函数)

我们要怎么给一组数据排序呢?例如可以给整形数据从小到大,也可以给浮点型数据从大到小,或者还可以比较字符串的大小也可以比较字符串的长度。这些我们就必须要写一个比较函数了。

具体的使用

要使用qsort函数我们要引用一个头文件<stdlib.h>

#include <stdlib.h>

比如我们要排序一个整形元素的数组


#include <stdio.h>
#include <stdlib.h>

int compar(const void *e1, const void *e2){
    return (*(int *)e1 - *(int *)e2);
}

int main()
{
    int arr[5] = {5, 2, 1, 4, 3};
    qsort(arr, 5, sizeof(arr[0]), compar);
    for (int i = 0; i < 5; i++){
        printf("%d ", arr[i]);
    }
    return 0;
}

打印出来的结果:c sort函数,c语言,排序算法,算法

可以看到升序排列,而改变成降序排列只需要改变compar里的内容即可。


#include <stdio.h>
#include <stdlib.h>

int compar(const void *e1, const void *e2){
    return -((*(int *)e1 - *(int *)e2));
}

int main()
{
    int arr[5] = {5, 2, 1, 4, 3};
    qsort(arr, 5, sizeof(arr[0]), compar);
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

c sort函数,c语言,排序算法,算法

可见,将return的值加上负号就能改变排列顺序,那么究竟是什么原因呢?接下来,我为大家用冒泡排序的方法实现这个函数。

#include <stdio.h>
#include <stdlib.h>

//交换函数的实现
void Swap(char *buf1, char *buf2, int width){
    while (width)
    {
        char box = *buf1;
        *buf1 = *buf2;
        *buf2 = box;
        buf1++;
        buf2++;
        width--;
    }
}

//比较函数的实现
int cmp(const void *e1, const void *e2){
    return *(int *)e1 - *(int *)e2;
}

void bubble_sort(void *base, int sz, int width, int (*cmp)(const void *, const void *)){
    int i, j = 0;
    for (i = 1; i < sz; i++){
        for (j = 0; j < sz - i; j++){
            // 调用cmp函数,这里可以规定函数排序的方式(升序or降序)
            if (cmp((char *)base + j * width, (char *)base + (j + 1) * width) > 0){
                // 满足上述条件,开始排序
                Swap((char *)base + j * width, (char *)base + (j + 1) * width, width);
            }
        }
    }
}

int main()
{
    int arr[5] = {4, 3, 1, 2, 5};
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz, sizeof(arr[0]), cmp);
    for(int i=0; i<5; i++){
        printf("%d ",arr[i]);
    }
    return 0;
}

 所以根据上述函数的内部实现可以得出return的数值如果大于0,那么就进行交换并且实现排序。那么如果想要反方向排序的话,只需要让return的数值取负值,及前一个数比后一个数小就交换,及降序排序。

各种类型的cmp函数实现(除了整型,上面已包含)

1.浮点型

int cmp(const void *e1, const void *e2){
   return (int)(*(float*)e1 - *(float*)e2);
}

2.比较字符串大小

int cmp(const void *e1, const void *e2){
    return strcmp((char*)e1,(char*)e2);
}

3.比较字符的长度

int cmp(const void *e1, const void *e2){
    return strlen((char*)e1) - strlen((char*)e2);
}

4.比较结构体变量文章来源地址https://www.toymoban.com/news/detail-744223.html

int cmp(const void *e1, const void *e2){
    return (int)(((stu*)e1)->weight - ((stu*)e2)->weight);
}

到了这里,关于C语言sort()函数的使用 详细介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python之排序函数sort(),sorted(),sort_values(),sort_index().

    1. sorted()函数 sorted()函数是Python的内置函数,此函数不改变原序列,在排序后会生成一个新的序列。调用时,一般只需要给出一个序列即可,该序列可以是列表,字典,元组,字符串。其余参数取默认值,默认为升序排序。最终结果将返回一个以列表为容器的返回值。若该序

    2024年02月04日
    浏览(46)
  • 排序算法(stable_sort(), sort())

    sort函数我相信大家都不陌生,今天介绍一个新的排序算法stable_sort stable_sort:稳定排序算法,维持相等元素的原有顺序。 假如我们定义一个字符串数组 这些字符串是按照字典序排列的,我们现在想要words按照单词长度从小到大重排的同时,还希望具有相同长度的元素按照字典

    2024年02月07日
    浏览(54)
  • 【排序算法】堆排序(Heap Sort)

    堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 学习堆排序之前,有必要了解堆!若读者不熟悉堆,建议先了解堆(建议可以通过二叉堆,左倾堆,

    2024年02月01日
    浏览(70)
  • C#中sort排序相关用法介绍

     C#中,List.Sort() 不仅为我们提供了默认的排序方法,还为我们提供了4种自定义排序的方法,通过默认排序方法,我们无需重写任何Sort()方法的实现代码,就能对单参数类型的List数据进行单一规则的排序,如果通过对这些方法进行改进我们可以轻松做到对多参数、多规则的复

    2024年02月15日
    浏览(60)
  • 46,排序算法sort

    排序算法sort 常用排序算法 sort 学习目标: 掌握i常用排序算法 算法简介: sort //对容器内元素进行排序 random_shuffle //洗牌,指定范围内的元素随机调整次序 merge //容器元素合并,并存储到另一容器中 reverse //反转指定范围的元素 功能描述: 对容器内元素进行排序 函数原型:

    2024年02月16日
    浏览(41)
  • c语言编写排序算法——直接插入排序(附详细代码)

    记号说明: a[k:r] 是指序列 a[k] a[k+1] a[k+2] … a[r] 。 为了讨论简单,假设待排序的每个记录是一个整数,这个整数就是排序码。 直接插入排序 :先将第一个记录看作是一个有序的记录序列,然后从第二个记录开始,依次将未排序的记录插入到这个有序的记录序列中去,直到整

    2024年02月11日
    浏览(42)
  • 【算法】桶排序(Bucket Sort)详解

    桶排序(Bucket Sort)又称箱排序,是一种比较常用的排序算法。其算法原理是将数组分到有限数量的桶里,再对每个桶分别排好序(可以是递归使用桶排序,也可以是使用其他排序算法将每个桶分别排好序),最后一次将每个桶中排好序的数输出。 桶排序的思想就是把待排序

    2024年01月24日
    浏览(43)
  • 算法 - 快速排序(Quick_sort)

    目录 什么是快速排序? 快速排序的使用场景: 演示快速排序的过程: 第一趟排序: 第二趟排序: 通过代码来实现:  对快速排序的总结: 在写快速排序的代码之前,我们先对快速排序的排序原理以及定义进行梳理: 快速排序(Quick_sort)是对冒泡排序的一种改进,它也是

    2024年02月10日
    浏览(42)
  • 算法 - 归并排序(Merge_sort)

    目录 什么是归并排序(Merging_sort)? 归并排序的适用场景: 演示归并排序的过程(默认arr和brr两个数组都是有序的): 代码实现: 如果我们事先并没有分配好两个已经排序好的数组,而是直接的一个无序序列呢? 代码实现: 在写归并排序的代码之前,我们先对归并排序的定义

    2024年02月13日
    浏览(49)
  • C++(15): STL算法:排序(sort)

            std::sort 是 C++ 标准库 algorithm 中提供的一个函数,用于对容器(如数组、向量等)中的元素进行排序。它基于比较操作对元素进行排序,通常使用高效的排序算法,如快速排序、归并排序或堆排序等。         在实际应用中,std::sort 通常会根据输入数据的大

    2024年04月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包