首页 > 其他分享 >qsort使用和模拟

qsort使用和模拟

时间:2024-11-09 18:17:13浏览次数:3  
标签:arr const int void qsort 使用 排序 模拟

我们先来了解一下qsort的如何使用,qsort也是一种排序,是快速排序quick  sort

使用qsort时要包含#include<stdlib.h>

qsort的参数非常多,让我们来一 一了解:

void qsort (
             void* base,//第一个参数,base指向的是待排序数组中首元素的地址
             size_t num,//第二个参数,num指向的是待排序数组中元素个数
             size_t size,//第三个参数,size指向的是待排序数组中每个元素的大小,单位字节
             int (*compar)(const void*,const void*)
            //第四个参数,是一个函数指针,用来比较base指向的数组中任意的俩个元素的大小
            );

这里我们思考一下为什么第一个参数是void*呢?

因为qsort并不知道未来的你会用qsort来排序什么类型,所以用泛型指针void*来接收,后面我们自己强制类型转换即可

接下来让我们实操一下qsort来排序整型数组:

#include<stdio.h>
#include<stdlib.h>
int cmp_arr (const void*e1,const void*e2)
{
   return *(int*)e1 - *(int*)e2;
//这里因为我们创建的数组是int类型,所以要强制类型转换int*类型
}

void print_arr(int arr[],int sz)
{
  int i=0;
  for(i=0;i<sz;i++)
  {
    printf("%d ",arr[i]);
  }
   printf("\n");//打印完后换行
}

int main()
{
  int arr[10]={3,2,5,4,1,6,0,9,7,8};//创建整型数组
  int sz=sizeof(arr)/sizeof(arr[0]);
  print_arr(arr,sz);//打印排序前的数组
  qsort(arr,sz,sizeof(arr[0]),cmp_arr);//使用qsort
  print_arr(arr,sz);//打印排序后的数组
  return 0;
}

当我们会使用qsort后,还记得我上一篇文章写的使用冒泡排序吗?让我们用冒泡排序思想来模拟一下qsort函数吧!

#include<stdio.h>
#include<stdlib.h>
int cmp_arr(const void*e1,const void*e2)
{
  return *(int*)e1 - *(int*)e2;
  //如果向减,大于0,返回>0的值,说明左边元素大于右边元素,需要swap交换
  //小于0,返回<0的值,说明左边元素小于右边元素,不需要swap交换
  //等于0,返回=0的值,说明这俩个元素相同
}


void Swap(char* buf1,char* buf2,size_t width)
{
  int i=0;
  for(i=0;i<width;i++)
  {
    //这里的i<width,是为了让每个字节每个字节单独交换,因为我们并不知道每个元素有几个字节
    //如果是int 则4个字节,short,则2个字节,char,则1个字节
     int tmp = *buf1;
     *buf1 = *buf2;
     *buf2 = tmp;
     buf1++;
     buf2++;
  }
}


void bubble_sort(void* arr,size_t sz,size_t width,int (*cmp_arr)(const void* e1,const void* e2))
       //这一步是在模拟qsort函数,我们开头也有讲qsort每个参数的内容
       //width是我们设置的宽度,每个字节的宽度
{
  int i=0;
  int j=0;
  for(i=0;i<sz;i++)
  {
     for(j=0;j<sz-1-i;j++)
     {
        //这里和冒泡排序一样,但是接下来就有所差异
        if( (*cmp_arr) ( (char*)arr+j*width, (char*)arr+(j+1)*width ) >0 )
       //这里就是比较俩俩元素的大小,如果cmp_arr返回大于0的值,那么实现下面swap交换
         {
            Swap((char*)arr+j*width, (char*)arr+(j+1)*width),width);
         }
     } 
  }
}



void print_arr(int arr[],int sz)
{
  int i=0;
  for(i=0;i<sz;i++)
  {
     printf("%d ",arr[i]);
  }
     printf("\n");
}



int main()
{
  int arr[10]={4,2,3,1,7,5,6,0,8,9};
  int sz=sizeof(arr)/sizeof(arr[0]);
  print_arr(arr,sz);//打印排序前的数组
  bubble_sort(arr,sz,sizeof(arr[0]),cmp_arr);
  //还是用冒泡排序,但是我们来模拟qsort函数思想
  print_arr(arr,sz);//打印排序后的数组
  return 0;
}

这就是qsort的模拟,可能对新手的我们(包括我自己)会觉得复杂而又难,我也学习了三遍,学了好几天,才慢慢了解和学会,所以小伙伴们可以多分析代码,多回忆qsort每个参数的含义!!

标签:arr,const,int,void,qsort,使用,排序,模拟
From: https://blog.csdn.net/CJH20050707/article/details/143636173

相关文章

  • 【Web前端】使用 JSON 处理数据
    JSON是一种基于JavaScript对象语法的数据格式,由道格拉斯·克罗克福特推广。尽管其语法源于JavaScript,JSON仍然是独立于JavaScript的,这也是为什么许多编程环境能够解析和生成JSON的原因。JSON可以以对象或字符串的形式存在,前者用于解析JSON数据,后者则用于通过网络......
  • GreatSQL 在 SQL 中使用 HINT 语法修改会话变量
    GreatSQL在SQL中使用HINT语法修改会话变量在GreatSQL支持一种新的优化Hint,名字叫SET_VAR,这个特性支持用户在查询语句里修改GreatSQL数据库的一些会话变量,当然修改只是对当前查询会话生效,不会影响到其他会话。SET_VAR语法SET_VAR这个hint用于临时设置系统变量的......
  • 如何在原生鸿蒙APP中使用RN的bundle包
    一、创作背景上一篇博客中,我给大家分享了如何创建一个RN的项目,并且解决了其中的问题点,成功打出了Bundle包。接下来就是我给大家分享一下,如何在原生鸿蒙项目中使用那个Bundle包,这一篇分享完才算是开发环境真正的搭建好了。在本篇中,我将继续分享环境搭建中会遇到的坑点,帮助大家快......
  • pcre2grep 是一个在 Windows 平台上也可以使用的命令行工具,属于 PCRE2 (Perl Compatib
    GitHub-mbuilov/grep-windows:InstructionsforbuildingGnuGrepandpcre2grepasnativewindowsapplications C:\Users\Administrator\Downloads>pcre2grep-10.44-x64Usage:pcre2grep[-AaBCcDdEeFfHhIilLMmNnOoPqrstuUVvwxZ][longoptions][pattern]......
  • AcWing 827:双链表 ← 数组模拟
    【题目来源】https://www.acwing.com/problem/content/829/【题目描述】实现一个双链表,双链表初始为空,支持5种操作:  ●在最左侧插入一个数;  ●在最右侧插入一个数;  ●将第k个插入的数删除;  ●在第k个插入的数左侧插入一个数;  ●在第k个......
  • 【Winform使用DataGridView实现表格数据的添加,编辑、删除、分页功能】
    Winform使用DataGridView实现表格数据的添加,编辑、删除、分页功能。一、效果预览二、代码Form1publicpartialclassForm1:Form{privateBindingSourcebindingSource=newBindingSource();privateList<Student>students=newList<S......
  • [DMY]2024 NOIP 模拟赛 Day 6
    今天状态不太好。赛时T1一看是概率先畏惧三分。拖拖拉拉写完了\(2^n\)的暴力后开始打表找特殊性质的规律。找了一个答案是\(8\over27\)\(=(\frac{2}{3})^3\),其中\(2\over3\)\(=\frac{10}{10+5}\)。然后意识到这个性质的答案是\((\frac{x}{a+x})^{\log_2n}\),快速写......
  • 盖世计划--北京营--0731--C班模拟
    A.数位和(digit)题意:设\(f(x)\)为\(x\)的数字和。例如\(f(158)=1+5+8=14\)。给定一个长度为\(N\)的正整数序列\(A\),求\(\sum_{i=1}^{N}\sum_{j=1}^{N}f(A_i+A_j)\)。分析:首先明确\(f(x)\)为\(x\)的数位和。举例情况:若有两个数分别为:\(12,21\)。\[f(12+21)=f......
  • API 2Y-60钢板在桥梁建设领域API 2Y-60钢板还在汽车制造和航空航天领域API 2Y-60钢板
    API2Y-60钢板具有广泛的应用前景。由于其优异的力学性能和耐腐蚀性,该钢板在海洋工程、石油管道、化工设备等领域具有广泛的应用。例如,在海洋平台制造中,API2Y-60钢板可用于制造平台的主体结构,承受海水的腐蚀和海浪的冲击;在石油管道制造中,该钢板可用于制造输油管道,确保石油在输......
  • Python中字符串的详细使用
    文章目录一、字符串的定义1.引号定义字符串2.转义字符二、字符串的访问1.字符串的索引2.字符串的切片三、字符串的方法1.替换replace()2.分割split()3.去除字符串两侧指定字符strip()4.用指定字符连接字符串join()5.查找子字符串find()6.其他常用方法四、字符串的格式......