快速排序qsort讲解

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

        hello大家好,我是c语言boom家宝,今天为大家分享的博客内容是qsort快速排序,简称快排的一个知识点的讲解。

        在讲到快排之前,允许博主先提一嘴冒泡排序。大家在c语言的学习过程中,冒泡排序是必不可少会学习到的一个思想,那么冒泡排序是怎么样的呢?我们看代码:

int main() {
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(int);
	for (i = 0; i < sz - 1; i++) {  //一共要交换多少次数
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++) {  //每一次交换的元素个数
			if (arr[j] > arr[j + 1]) {
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}

	}
	for (i = 0; i < sz; i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}

        这样就完成一个冒泡排序啦,非常的简单。但是冒泡排序简单是简单,可是效率十分的低。它通过重复很多次的挨个比较,然后交换的方式达成最后的排序效果。如果数组内容非常非常的多呢?那么排序所用的时间将会非常的多。其次,上面的这个冒泡排序只适用于排序整型。如果我又需要对其他类型的数据排序,如浮点型,字符型等,那么就需要重新写一个冒泡排序的代码,十分的复杂。基于这几点原因,所以博主将讲解一下qsort快速排序的使用:

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

        库函数qsort,快排,适用于任何类型数据的排序。使用时需要引用<stdlib.h>头文件
博主在官网上查询qsort的使用方法,它们是这样介绍的:如图

快速排序qsort讲解,算法,排序算法

        我们再来看一下使用qsort库函数需要调用的参数是什么

快速排序qsort讲解,算法,排序算法

        那么qsort函数的返回值是什么,如图:

快速排序qsort讲解,算法,排序算法

         也就是说如果p1指向的元素值小于p2指向的元素值,返回一个小于0的数。反之,返回一个大于0的数。如果相等,则返回0.

        总结一下,当我们要使用qsort库函数的时候,需要传的参数如下。他们各自表示的意思也有打在备注里面,方便大家理解。如果不知道什么是函数指针,请移步链接:http://t.csdn.cn/FtRCn,博主有在里面对函数指针进行讲解,这很重要,因为要想使用qsort库函数,必须要创建一个函数指针才可以。

void qsort(void* base,   //指向了需要排序的数组的第一个元素
           size_t num,   //排序的元素个数
           size_t size,  //一个元素的大小,单位是字节
           int (*cmp)(const void*,const void*)  //函数指针类型,
                               //这个函数指针指向的函数,需要能够比较base指向数组中的两个元素
          );


        细心的阅读朋友会发现,这个函数指针的参数部分类型是const void*类型。而void*这个类型有一些特殊,void*不能直接进行解引用操作,也不能直接进行指针的运算。但是,void*指针是无具体类型的指针,它可以接收任意类型的地址。这一点就十分妙哉,因为我们在使用函数过程中并不会提前知道你具体会传过来什么类型的参数。如果还像上面冒泡排序一样,那么就写死了,就只能完成一个类型数据的排序。 既然不能直接解引用,那我们就可以在使用的时候把它强制转换成我们需要的类型。具体实现如下:

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

int cmp_int(const void* p1, const void* p2) {
	return(*(int*)p1 - *(int*)p2);
}

void test1() {
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(int);
     //qsort默认排的是升序
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < 10; i++) {
		printf("%d ", arr[i]);
	}
}
int main() {
	
	test1();
	
	return 0;
}

        qsort默认是排成升序,如果想排成降序,我们只需要把上述代码中的return(*(int*)p1 - *(int*)p2);改成return(*(int*)p2 - *(int*)p1);就可以了。上述代码编译结果如下

快速排序qsort讲解,算法,排序算法

        当然,前面也说到过,qsort可以排序任何一个类型的。博主这里再举例用qsort来排序结构体又是怎么排序的呢?代码如图

快速排序qsort讲解,算法,排序算法

        我们只需要按照格式去传参数,然后写一个函数指针就可以了。qsort有着十分高效的效率,各位阅读朋友可以自己尝试一下去写一个快排出来 

 

到了这里,关于快速排序qsort讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 数据结构进阶篇 之 【交换排序】(冒泡排序,快速排序递归、非递归实现)详细讲解

    当你觉的自己不行时,你就走到斑马线上,这样你就会成为一个行人 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)
  • 排序算法-归并排序详细讲解(MergeSort)

    归并,指合并,合在一起。归并排序(Merge Sort)是建立在归并操作上的一种排序算法。其主要思想是分而治之。 若将两个有序集合并成一个有序表,称为2-路归并,与之对应的还有多路归并。 对于排序最好的情况来讲,就是只有两个元素,这时候比较大小就很简单,但是还

    2024年02月08日
    浏览(40)
  • c语言用冒泡排序模拟实现qsort排序

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

    2024年02月15日
    浏览(45)
  • 【排序算法】快速排序的基本算法

            快速排序是应用最广泛的排序算法,流行的原因是它实现简单,适用于各种不同的输入数据且在一般应用中比其他排序算法都要快得多。快速排序引人注目的特点是原地排序,只需要一个很小的辅助栈,且将长度为N的数组排序所需时间和NlgN成正比。另外,快速排序

    2024年01月22日
    浏览(50)
  • c---冒泡排序模拟qsort

    冒泡排序 冒泡排序原理:两两相邻元素进行比较 初级版 这是冒泡排序初级版,不管其原内容是否有序都会进行比较,如果原内容原本就是有序的,再每个都进行比较效率就会低下,那么这时候可以改进一下,想一个标记变量来记录是否有序,如int falg = 0; 如果无序的情况下

    2024年01月18日
    浏览(40)
  • 冒泡排序模拟实现qsort()函数

    要模拟qsort()函数,我们首先要知道qsort()函数的特点: 使用快速排序的方法。 适用于任何数据类型的排序。 但由于部分学者还没有学习快速排序算法,所以本篇博客采用冒泡排序来模拟功能类似于qsort()的函数bubble_sort。 C库对qsort()函数解释: 我们得到的关于qsort()函数参

    2024年02月16日
    浏览(53)
  • 8 大内部排序算法图文讲解

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排

    2024年02月20日
    浏览(24)
  • 【排序算法】归并排序与快速排序

           🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️小林爱敲代码       🛰️博客专栏:✈️ 算法训练笔记       🛰️社区 :✈️ 进步学堂       🛰️欢迎关注:👍点赞🙌收藏✍️留言 今天给大家分享两种排序,一种是

    2024年01月19日
    浏览(38)
  • 算法基础15 —— 分治算法(归并排序 + 快速排序)

    分治法的基本概念、思想 分治法是一种很重要的算法。 字面解释,分治分治,分而治之。就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 不难发现,分

    2024年02月03日
    浏览(50)
  • 【排序算法(三)】交换排序(冒泡排序&&快速排序)

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯 长路漫漫浩浩,万事皆有期待 上一篇博客:【排序算法(二)】选择排序(直接选择排序堆排序) 冒泡排序属于交换排序,所谓 交换排序 就是就是根据序列中两个记录

    2023年04月22日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包