实现qsort函数

简介: qsort函数是C语言中快速排序的一个函数,不会的可以去http://t.csdn.cn/TP8cv看看这个函数的用法,现在我们看看自己怎么实现这个函数

首先,我们先将这个原函数找出来,对每个参数部分进行实现

那我们自己写的这个bubble_sort函数的各个参数至少都得一样,这是保持函数功能一样的最低标准(除了有的参数名称不同)

实际上,这个函数的内部原理依旧是冒泡法的原理

难点就是内部进行arr[j]和arr[j+1]的比较,并且升序排序


我们现在知道需要比较数据元素的首原素的地址,知道每个元素所占的字节大小,数据元素数量,和compar函数的返回类型,我们要每次精确定位每一个数据元素,就必须与   j   相结合,我们可以先将base强制类型转化为char*类型,char*类型只占一个字节,那么当你用j去乘、数据元素的字节数再加上数据元素本身的地址时,就可以精确锁定arr[j]和arr[j+1]对应的元素

                       
对应arr[j]


对应arr[j+1]

那么只需要知道compar函数的返回值,即可判断arr[j]和arr[j+1]的大小,并判断是否交换,即

再写交换函数,由于我们不知道我们要排序的到底是什么类型的数据类型,可能是int.可能是float还可能是char,结构体等等,所以难点依旧是再比较完两个数据类型后,如何交换它。因为我们之前已经将要比较数据元素的地址类型强制转化为(char*)类型,所以每次指针加一只向前移动一个字节,并且要交换的两个数据元素的类型肯定是相同的,所以可以每次只交换一个字节的内容

这样就可以将两个数据元素交换,至于要进行什么数据元素类型的排序,则可以又自己来定,对应的compar函数也需要自己来写,我这里就用int型来举例子

#include<stdio.h>
//自己实现qsort函数
//void qsort (void* base, size_t num, size_t size,int (*compar)(const void*, const void*));
void swap(char* buff1, char* buff2,int width)
{
  int i = 0;
  for (i = 0; i <width; i++)
  {
    char tmp = *buff1;
    *buff1 = *buff2;
    *buff2 = tmp;
    buff1++;
    buff2++;
  }
}
void bubble_sort(void* base, int num, int width, int(*compar)(const void*, const void*))
{
  int i = 0;
  for (i = 0; i < num - 1; i++)
  {
    int j = 0;
    for (j = 0; j < num - 1 - i; j++)//
    {
      //arr[j]  arr[j+1]的实现  
      if (compar((char*)base + j * width , (char*)base + (j + 1) * width) > 0)
      {
        swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
      }
    }
  }
}
int compar(const void* p1, const void* p2)
{
  return (*(int*)p1) - (*(int*)p2);
}
int main()
{
  int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
  bubble_sort(arr,10,sizeof(arr[0]),compar);//自己的qsort函数
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

输出结果

成功!!!

相关文章
|
SQL 分布式计算 MaxCompute
odps sql 怎么实现递归查询?
odps sql 怎么实现递归查询?
1652 1
|
数据采集 机器学习/深度学习 Python
深度学习中的高效数据预处理技巧
【7月更文第29天】在构建深度学习模型时,数据预处理是至关重要的步骤之一。高质量的数据预处理可以显著提高模型的性能并加速训练过程。本文将探讨几种有效的数据预处理技巧,包括数据清洗、特征归一化和数据增强,并通过实际的Python代码示例进行说明。
1583 5
|
监控 网络协议 安全
基于标准C语言实现的跨平台Modbus协议库
基于标准C语言实现的跨平台Modbus协议库
|
机器学习/深度学习 人工智能 搜索推荐
快手封号是什么原因造成的?
快手账号封禁机制的技术逻辑与常见诱因
|
监控 数据可视化 数据挖掘
数据看板制作工具评测:这6款工具能如何提升企业的数据分析效率?
本文介绍了6款数据看板制作工具,包括板栗看板、Tableau、Power BI、Qlik Sense、Google Data Studio和Looker,从功能、适用场景等方面进行了详细对比,旨在帮助企业选择最合适的工具以实现高效的数据可视化和管理决策。
1546 4
|
机器学习/深度学习 自动驾驶 机器人
深度学习之人类行为模仿
基于深度学习的人类行为模仿是指利用深度学习技术构建模型,使计算机系统能够学习、理解、并模仿人类的行为。通过模拟人类的动作、决策过程、情感反应等行为,相关技术在机器人、虚拟助手、人机交互等领域具有广泛的应用前景。
607 5
|
存储 数据处理 图形学
什么是帧同步技术?
【5月更文挑战第3天】什么是帧同步技术?
1242 9