C语言模拟实现标准库函数之qsort()

qsort

编译器函数库自带的快速排序函数。

void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));

参数解释:

  • void*base-待排序数组首地址
  • size_t num-数组中待排序元素数量
  • size_t width-各元素的占用空间大小
  • int(__cdecl*compare)(const void*,const void*)-指向比较两个元素的函数的指针

qsort函数的用法

#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort */int compare (const void * a, const void * b)
{return ( *(int*)a - *(int*)b );
}int main ()
{int n;int values[] = { 40, 10, 100, 90, 20, 25 };qsort (values, 6, sizeof(int), compare);for (n=0; n<6; n++)printf ("%d ",values[n]);system("pause");return 0;
}

这里写图片描述

例子2:

#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort */int compare(const void * a, const void * b)
{return (*(int*)a - *(int*)b);
}int main()
{char s[3][4] = { "z","g","c" };  //字符串数组排序 qsort(s, 3, sizeof(s[0]), compare); //sizeof(s[0])=sizeof(char)for (int i = 0; i<3; i++)printf("%s\n", s[i]);system("pause");return 0;
}

这里写图片描述

模拟实现qsort

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>/*
判断n1,n2元素大小,n1比n2大返回正数;小返回负数,相同返回0
*/
int cmp(const void*n1, const void*n2)
{return *(char*)n1 - *(char*)n2;                //升序  
}/*
交换每个字节
sizeof(char) = 1;sizeof(int ) = 4;
sizeof(arr1[0])=1;sizeof(arr[0])=4;
*/
void Swap(char *buf1, char* buf2, int width)
{int i = 0;for (i = 0; i < width; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}/*
冒泡排序法
*/
void bubble_sort(void *base, int sz, int width, int(*cmp)(const void* n1, const void*n2))      //模拟实现qsort  
{int i = 0;for (i = 0; i < sz - 1; i++){int j = 0;for (j = 0; j < sz - 1 - i; j++){int ret = cmp(((char*)base + (j*width)), ((char*)base + (j + 1)*width));if (ret>0){Swap(((char*)base + (j*width)), ((char*)base + (j + 1)*width), width);}}}
}int main()
{int i = 0;int arr[] = { 1, 4, 7, 5, 6, 9 };bubble_sort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp);for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}printf("\n");/*printf输出格式"%s"*/char arr1[] = { 'a','f','y','w','b' };bubble_sort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), cmp);for (i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++){printf("%c ", arr1[i]);}printf("\n");system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux之管道

管道&#xff08;PIPE&#xff09;是linux中一个重要的通信方式&#xff0c;在进程中&#xff0c;我们通过从一个进程中读取到的数据转到另一个进程中的写数据中&#xff0c;这时就要有不同的进程之间共享同一份资源&#xff0c;就是所谓的进程间通信。由于进程的特点是资源独占…

linux之多线程(1)

我们之前讲了进程&#xff0c;今天我们重新认识另外一个概念---线程。我们首先会想到的是进程和线程有什么区别和联系&#xff0c;对吧&#xff1f;进程是由程序执行起来&#xff0c;跑在操作系统的&#xff0c;是系统进行资源分配和调度的基本单位。进程具有资源独占性&#x…

linux之睡眠函数(my_sleep)

我们在程序中&#xff0c;很多次用到sleep()函数&#xff0c;让它睡眠几秒后再执行该进程。今天呢&#xff0c;我要给大家实现一下sleep函数。 看看代码哦&#xff1a; 运行结果&#xff1a; 结果中每隔三秒钟&#xff0c;打印一条语句。实现了sleep(3)的功能。 关于sleep函数…

C语言 防止头文件被多次引用

comm.h和comm.c是公共模块。 test1.h和test1.c使用了公共模块。 test2.h和test2.c使用了了公共模块。 test.h和test.c使⽤用了了test1模块和test2模块。 这样最终程序中就会出现两份comm.h的内容。这样就造成了了文件内容的重复。 1.方法1 文件开头加上这一句就ok #prag…

详解强制类型转换

今天谈谈类型转换的问题吧&#xff0c;之前我们也遇到过类型转换&#xff0c;比如c语言中这样的赋值&#xff1a; 显然&#xff0c;i和j是不同类型的变量&#xff0c;但是却可以完成赋值&#xff0c;结果是这样的&#xff1a; 其实它们是做了隐式的类型转换&#xff0c;相当于&…

c++之类型萃取

刚刚我们接触过模板类&#xff0c;类似于这样的&#xff1a; 在这个类中&#xff0c;我们如何知道它是什么类型的呢&#xff1f;这里&#xff0c;我们可以在类中加入一个内嵌类型&#xff0c;如&#xff1a; 这样就可以知道它是用户自定义的还是本身类型就拥有的&#xff0c;我…

时间复杂度空间复杂度

我们编过不少代码&#xff0c;起初学习的时候我们习惯性的认为&#xff0c;只要代码能正确的运行就ok啦~很少考虑代码的优化带来的好处。今天说一下影响代码性能的两个重要指标--时间复杂度&空间复杂度。 时间复杂度&#xff1a;就是函数&#xff08;指数学中的函数&#…

C语言 函数递归例题解析

1.接受一个整形值&#xff08;无符号&#xff09;&#xff0c;把它转换为 字符并打印它模拟实现strlen()函数。3.求n的阶乘4.斐波那契数列总结 1.接受一个整形值&#xff08;无符号&#xff09;&#xff0c;把它转换为 字符并打印它 void fun(int x) {if (x > 9){fun(x/10)…

剖析printf函数

printf是什么&#xff0c;对于起初学习c语言的同学来说肯定都特别的疑惑。在这里&#xff0c;解答一下&#xff1a;它是一个函数。既然是一个函数的话&#xff0c;想必肯定有返回值和参数吧。那么它的返回值和参数是什么呢&#xff1f; 1、看一下这个例子&#xff0c;可能更好…

大端小端详解

文章目录为什么有大端小端&#xff1f;大端&#xff1a;低位放在高地址&#xff0c;高位放在低地址小端&#xff1a;低位放在低地址&#xff0c;高位放在高地址面试考点&#xff1a;代码代码2一道面试题为什么有大端小端&#xff1f; 大端&#xff1a;低位放在高地址&#xff0…

详解volatile关键字

volatile字面意思&#xff1a;易变的。在计算机里&#xff0c;是防止优化的意思&#xff0c;然而是怎么防止优化的呢&#xff1f;待我一一道来哦。 先看这样一个例子&#xff1a; <span style"font-size:18px;">#include<iostream> using namespace std…

C语言 有符号字符型输出 面试题

1.第一题 int main() {int a 128;printf("%u\n", a);system("pause"); } 输出结果 128 #include <stdio.h> #include <stdlib.h>int main() {char a 128;printf("%u\n", a);system("pause"); } 输出结果 42949671…

有趣的链表相关题型

链表&#xff1a;也是线性表的一种。形象的来说&#xff1a; 就像火车的一个个车厢一样&#xff0c;一个个的链起来的。它有一个特点&#xff1a;它的头没有前驱&#xff0c;尾没有后继。 为什么会引入链表这个概念呢&#xff1f;之前我们知道的顺序表&#xff0c;是用数组的形…

有趣的约瑟夫环问题

大家有没有听过约瑟夫环这个问题呢&#xff1f;我们先来看看它是一个什么样的问题~ 约瑟夫环&#xff08;Josephus&#xff09;问题是由古罗马的史学家约瑟夫&#xff08;Flavius Josephus&#xff09;提出的。该问题的说法不一&#xff0c;传说他参加并记录了公元66—70年犹太…

一系列链表题

1、链表的倒序输出&#xff1a;(输出4&#xff0c;3&#xff0c;2&#xff0c;1)在这里&#xff0c;可以使用递归的方式&#xff1a; <span style"font-size:18px;">void Reverse(pNode pHead) {if(pHead){Reverse(pHead->next);cout<<pHead->data…

c++之指针引用

指针&#xff1a;指向一块内存地址的标识。 引用&#xff1a;给已经定义的变量起的别名。 格式&#xff1a; 类型 &引用变量名 已定义的变量名&#xff08;引用变量名和已定义的变量名可以看成是同一个实体&#xff0c;一个改变&#xff0c;另一个也随之改变&#xff0…

python之条件、循环语句

其实&#xff0c;很多语言的语法都是相通的&#xff0c;包括初学python一样。 今天要说的是条件、循环语句。这部分也是相对比较简单的&#xff0c;就python而言&#xff0c;只是书写方式稍作改动罢了。 1、条件语句 &#xff08;1&#xff09;格式&#xff1a; if 判断条件…

静态多态之泛型编程(模板)

起初&#xff0c;我们写不同类型的加法函数是这样写的吧&#xff1a; //Template.h #pragma onceint Add(const int left,const int right) {return leftright; }char Add(const char left,const char right) {return leftright; }float Add(const float left,const float rig…

【数据结构】布隆过滤器原理详解及其代码实现

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…

c++详解【继承】

学过c的人都知道&#xff0c;c的三大特性&#xff1a;封装、继承、多态。 我们今天说的是c的继承&#xff0c;那么为什么要引入继承&#xff0c;它有什么特点呢&#xff1f; 首先&#xff0c;继承的特点是&#xff1a;使代码复用&#xff0c;为后面学习多态做铺垫。 继承分为…