用冒泡排序实现快速排序(qsort函数),指针进阶实例

这篇具有很好参考价值的文章主要介绍了用冒泡排序实现快速排序(qsort函数),指针进阶实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

 文章来源地址https://www.toymoban.com/news/detail-832428.html

1、qsort函数是什么

2、冒泡排序实现指针进阶

2.1 主函数

2.2 功能函数声明​编辑

2.3 my_qsort函数介绍

2.4 Swap函数

总结


 

1、qsort函数是什么

        qsort函数是c语言自带的函数,其功能是实现快速排序。我们来看一下他的参数和返回值:用冒泡排序实现快速排序(qsort函数),指针进阶实例,c语言学习,c语言,开发语言

        以上就是qsort的参数和返回值,可以看到,其返回值是void也就是没有返回值;而参数方面,包括:void* base 这是要排序的数据的起始位置的指针、 size_t num 待排序的数据元素个数、 size_y width 待排序数据元素的大小(单位是字节)、 int(* cmp)(const void* e1,const void* e2) 函数指针变量,其指向一个返回值为int类型,参数为两个void*的指针e1和e2,他们分别指向要排序数据的第一个元素和第二个元素。

        看一个用qsort实现的排序:用冒泡排序实现快速排序(qsort函数),指针进阶实例,c语言学习,c语言,开发语言

        我们需要自己定义一个cmp函数,里面设计一个比较函数,e1 和 e2 指向数据的前两个元素,如果设计为:*e1大于*e2时返回正值;*e1等于*e2时返回0;*e1小于*e2时返回负值时,qsort就会实现对数据的升序排列,反之,qsort就会实现降序排列。因此,我们发现,qsort实现的功能其实取决于我们如何去设计cmp函数。此外,qsort可以比较不仅限于整型数据的大小,还可以比较字符串等等各种类型的大小,其规则和整型相同,都是取决于如何去设计cmp函数。

        好了,讲到这我们大致了解了qsort函数,现在,我们将用冒泡排序去实现qsort的功能。这样的练习有助于我们更好地了解和运用指针,实现我们对c语言的进阶。

2、冒泡排序实现快速排序

        先看看最终代码:

#include <stdio.h>

void my_qsort(void* base, int num, int width, int (*cmp)(const void* e1, const void* e2));
void Swap(char* e1, char* e2, int width);
int cmp(const void* e1, const void* e2);

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

void my_qsort(void* base, int num, int width, int (*cmp)(const void* e1, const void* e2))
{
	int i = 0;
	for (i = 0;i <num-1;i++)
	{
		int flag = 1;
		int j = 0;
		for (j = 0;j < num - 1 - i;j++)
		{
			if (cmp((char*)base + width * j, (char*)base + width * (j + 1)) < 0)
			{
				//交换
				Swap((char*)base + width * j, (char*)base + width * (j + 1),width);
			}
			
		}
	}
}

void Swap(char* e1, char* e2, int width)
{
	int i = 0;
	int c = 0;
	for (i = 0;i < width;i++)
	{
		c = *(e1 + i);
		*(e1 + i) = *(e2 + i);
		*(e2 + i) = c;
	}
}

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

效果:

用冒泡排序实现快速排序(qsort函数),指针进阶实例,c语言学习,c语言,开发语言

可见确实模拟出了qsort的效果。

一步步分析:

2.1 主函数

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

        主函数主要是arr数组的定义,求其长度sz,引用my_qsort函数和打印排序后的函数。没有需要重点讲的。

        接下来介绍所运用到的功能函数:

2.2 功能函数声明

        这里包括了三个函数,my_qsort就是用冒泡排序模拟实现qsort的函数,Swap函数是用来交换e1和e2的函数,cmp就是正常qsort中我们需要自己设定的函数,可以通过改变cmp的内容实现不同效果的排序。其中cmp在上面已经介绍过了所以下面我只重点介绍my_qsort函数和Swap函数。

2.3 my_qsort函数介绍

用冒泡排序实现快速排序(qsort函数),指针进阶实例,c语言学习,c语言,开发语言

        首先要明白,这个函数的主要思想其实是一个冒泡排序。只不过在正常冒泡排序的交换过程我们用了Swap函数代替。

        重点来了,来看看其中这两行的代码:用冒泡排序实现快速排序(qsort函数),指针进阶实例,c语言学习,c语言,开发语言

        这里我们将原本void类型的代码转化为了cahr*,这是因为,我们模拟的qsort是一个可以对任何数据进行排序的函数,不仅限于int类型,所以,我们要想一个办法能够用指针去指向任意大小的数据,我们考虑的就是char*类型,因为我们传参的时候将元素的大小width传了过来,这样,我们定义了char*类型的指针(1字节),只需要用i*width就可以指向后i个数据;反之,如果不用char*类型的话,其他类型的指针步长本身都不为1字节,,这样加上i无法确定指针指向了哪个数据。

        下面,来讲解一下Swap函数:

2.4 Swap函数

用冒泡排序实现快速排序(qsort函数),指针进阶实例,c语言学习,c语言,开发语言

        Swap函数实现的是大小为width的两个元素的互换,由于我们指针e1和e2为char类型,所以,想要完全互换的话,需要对指针后width个内容都进行互换,因此我们写了如此一个循环进行互换。

总结

        以上,就是用冒泡排序实现qsort函数的模拟了,它不仅可以对整型数据进行排序,还可以对任意类型数据进行排序,其中运用到了函数指针,也要求编程者对函数有一定深刻的理解。了解好原理,自己动手去完成这样一个函数模拟,我相信,你对指针的的理解会上升一个台阶。

 

到了这里,关于用冒泡排序实现快速排序(qsort函数),指针进阶实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 用代码生撸qsort函数来实现冒泡排序

    作者主页: paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者: 大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于 《C语言》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将C语言基础知识一网打尽,希望可

    2024年02月09日
    浏览(44)
  • C语言-指针进阶-qsort函数的学习与模拟实现(9.3)

    目录 思维导图: 回调函数 qsort函数介绍 模拟实现qsort 写在最后: 什么是回调函数? 回调函数是一个通过函数指针调用的函数。 将一个函数指针作为参数传递给一个函数,当这个指针被用来调用所指向函数时, 我们就将此称为回调函数。 在举例之前,我们先学习一个C语言

    2024年02月15日
    浏览(54)
  • 【再识C进阶2(中)】详细介绍指针的进阶——函数指针数组、回调函数、qsort函数

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖        在这一篇博客中,我们要认识并理解 函数指

    2024年02月09日
    浏览(45)
  • 数据结构进阶篇 之 【交换排序】(冒泡排序,快速排序递归、非递归实现)详细讲解

    当你觉的自己不行时,你就走到斑马线上,这样你就会成为一个行人 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 冒泡排序的特性总结 2.1 基本思想 2.2 递归实现 2.2.1 hoare版 2.2.2 前后指针版本 2.3 快速排序优化 2.3.1 随机数选key 2.3.2 三数取中选key 2.3.3 递归到小的子区间使用插入排

    2024年04月10日
    浏览(64)
  • c语言用冒泡排序模拟实现qsort排序

    1、简单介绍冒泡排序 冒泡排序就是两两相邻元素进行比较,如果不满足顺序就进行交换。现有一组整数,将其用冒泡排序实现排序为升序。 假设有这样一组整数:9 8 7 6 5    由此可知,如果一个整型数组有num个元素,则需走num-1趟,若走在第i趟,则在第i趟内需要比较num-1

    2024年02月15日
    浏览(45)
  • 还在使用冒泡排序遍历数组?No No No 库函数qsort帮你搞定所有排序还不快学起来!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,刚开始学编程的时候我们都是用冒泡来进行排序的,今天给大家介绍一下新的排序方法库函数qsort!    ⛳️ sor英文原意是

    2024年02月14日
    浏览(41)
  • 【C语言】用冒泡排序实现my_qsort

    大家好,我是苏貝,本篇博客带大家了解如何用冒泡排序实现my_qsort,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 用冒泡排序实现my_qsort?你或许觉得没有必要这样做,有现成的qsort函数,为什么还要自己写一个呢?于我而言,它可以让我对冒泡排序和q

    2024年02月07日
    浏览(35)
  • 【C语言】指针的进阶(二)—— 回调函数的讲解以及qsort函数的使用方式

    目录 1、函数指针数组 1.1、函数指针数组是什么?  1.2、函数指针数组的用途:转移表 2、扩展:指向函数指针的数组的指针 3、回调函数 3.1、回调函数介绍  3.2、回调函数的案例:qsort函数 3.2.1、回顾冒泡排序  3.2.1、什么是qsort函数? 函数指针数组 是什么?首先主语是 数

    2024年02月07日
    浏览(43)
  • C语言快速排序——qsort函数

      上面的是我们标准C语言库里面对qsort函数的介绍,我们先来从排序说起:  这就不得不提出编程中最最基础的排序算法--- 冒泡排序  对于一个任意的无序数列,我们如果想要把他排成顺序数列的话,我们就可以让每一项跟后面的一项去比较,然后交换两个数,最终得到一个

    2024年01月22日
    浏览(50)
  • C语言 快速排序——qsort函数详解

            我们在使用冒泡排序法做题的时候,经常会遇到运算次数过多程序超时的情况,而且冒泡排序法只能对整形数组进行排序。         为了解决这些问题!就使用 qsort函数 吧! 目录 一、qsort函数使用方法 二、qsort函数使用示例      1.数组排序      2.字符数组排序  

    2024年02月03日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包