c语言用冒泡排序模拟实现qsort排序

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

1、简单介绍冒泡排序

冒泡排序就是两两相邻元素进行比较,如果不满足顺序就进行交换。现有一组整数,将其用冒泡排序实现排序为升序。

假设有这样一组整数:9 8 7 6 5 

c语言用冒泡排序模拟实现qsort排序,c语言,算法,数据结构

 由此可知,如果一个整型数组有num个元素,则需走num-1趟,若走在第i趟,则在第i趟内需要比较num-1-i次。

#include<stdio.h>
void bubble_sort(int arr[], int sz)
{
	int i = 0;
	//趟数
	for (i = 0; i < sz - 1; i++)
	{
		//一趟比较
		//两两相邻元素比较
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				arr[j] = arr[j + 1];
			}
		}
	}
}
int main()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

2、介绍qsort函数

void qsort(void* base, //指向了需要排序的数组的第一个元素

                 size_t num, //排序的元素个数

                size_t size,//一个元素的大小,单位是字节

                int (*cmp)(const void*, const void*)//函数指针类型 ,此函数指针指向的函数能够比较base指向数组中的两个元素

                );

int cmp (const void* p1, const void* p2);

该函数通过返回值来定义元素的顺序

返回值 意义
>0 p1指向的元素 在p2指向的元素之前
0 p1指向的元素等效于p2指向的元素
<0 p1指向的元素在p2指向的元素之后

void* 的指针是没有具体类型的指针,这类指针可以接受任意类型的地址,但是这类指针不能直接解引用操作,也不能直接进行指针运算。

qsort函数的特点:

                1、是快速排序的方法

                2、适用于任意类型数据的排序

3、用冒泡排序模拟实现qsort排序

        将冒泡排序封装成函数,如上buttle_sort(),则此函数需传递同类型的参数且参数个数相等:void buttle_sort(void* base,rsize_t num,size_t size,int(*cmp)(const void*,const void*)),且由于传递的数据类型不确定,则比较的方法和交换数据的方法有所不同,故可以使用函数来封装比较和交换的方法,由于冒泡排序函数buttle_sort传递的是首元素的地址,

c语言用冒泡排序模拟实现qsort排序,c语言,算法,数据结构

若想比较并交换两个元素就需要元素的地址,故比较函数和交换函数传递的参数都为元素地址,c语言用冒泡排序模拟实现qsort排序,c语言,算法,数据结构由于传递参数的类型不确定,那么元素的大小也无法确定,int类型的指针通过首元素地址加其所对应下标即为其地址,而void*类型指针无法直接进行指针运算,需将其类型强制转换,冒泡排序函数buttle_sort传递size为元素的字节个数,char为最小字节的类型,可以用来比较任意类型的数据,故将(void*)base强制转化为(char*)base,故void*类型的指针可通过(char*)base + j * size,(char*)base+(j+1)*size来解引用比较相邻元素的大小,故比较函数为cmp((char*)base + j * size,(char*)base+(j+1)*size),交换函数为swp((char*)base + j * size, (char*)base + (j + 1) * size,size),就有了如下函数的代码

//交换
void swp(char* butt1, char* butt2,int size)
{
	int i = 0;
	for(i; i < size; i++)
	{
		char temp = *butt1;
		*butt1 = *butt2;
		*butt2 = temp;
		butt1++;
		butt2++;
	}
}
//冒泡排序所有类型数据
void buttle_sort(void* base,rsize_t num,size_t size,int(*cmp)(const void*,const void*))
{
	int i = 0;
	//趟数,需要n-1趟
	for (i; i < num - 1; i++)
	{
		int j = 0;
		//每趟比较次数
		for (j; j < num - 1 - i; j++)
		{
			//比较,若按升序排列,cmp返回值需>0
			if (cmp((char*)base + j * size,(char*)base+(j+1)*size)>0)
			{
				//交换
				swp((char*)base + j * size, (char*)base + (j + 1) * size,size);
			}
		}
	}
}

比较函数的具体实现因数据类型不同而不同,故比较函数由操。作方即调用函数的一方来书写实现过程。

测试1

#include<stdio.h>

//整型比较
int cmp_int(const void* p1 ,const void* p2 )
{
    return (*(int*)p1 - *(int*)p2);
}

void test1()//qsort测试整形数据
{
    int a[10] = { 2,1,3,0,5,7,4,9,6,8 };
    int num = sizeof(a) / sizeof(a[0]);
    buttle_sort(a, num, sizeof(a[0]), cmp_int);
    int i = 0;
    for (i; i < num; i++)
    {
        printf("%d \n",a[i]);
    }
}

int main()
{
    test1();
    return 0;
}

测试结果:

c语言用冒泡排序模拟实现qsort排序,c语言,算法,数据结构

测试2

#include<stdio.h>
#include<string.h>

struct Stu
{
    char name[20];
    int age;
};

//结构体通过名字比较
int cmp_struct_by_name(const void* p1, const void* p2)
{
    return strcmp((struct Stu*)p1->name, (struct Stu*)p2)->name;
}


void test2()//qsort测试结构体数据
{
    struct Stu stu[3] = { {"zhangsan",20},{"lisi",50},{"wangwu",15} };
    int num = sizeof(stu) / sizeof(stu[0]);
    buttle_sort(stu, num, sizeof(stu[0]), cmp_struct_by_name);
    int i = 0;
    for (i; i < num; i++)
    {
        printf("%s %d\n", stu[i].name, stu[i]age);
    }
}

int main()
{
    test2();
    return 0;
}

测试结果:

c语言用冒泡排序模拟实现qsort排序,c语言,算法,数据结构

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

测试3

#include<stdio.h>

struct Stu
{
    char name[20];
    int age;
};

//结构体通过年龄比较
int cmp_struct_by_age(const void* p1, const void* p2)
{
    return  ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}

void test3()//qsort测试结构体数据
{
    struct Stu stu[3] = { {"zhangsan",20},{"lisi",50},{"wangwu",15} };
    int num = sizeof(stu) / sizeof(stu[0]);
    buttle_sort(stu, num, sizeof(stu[0]), cmp_struct_by_age);
    int i = 0;
    for (i; i < num; i++)
    {
        printf("%s %d\n",stu[i].name,stu[i]age);
    }
}
int main()
{
    test3();
    return 0;
}

测试结果:

c语言用冒泡排序模拟实现qsort排序,c语言,算法,数据结构

 

 

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

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

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

相关文章

  • c---冒泡排序模拟qsort

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

    2024年01月18日
    浏览(31)
  • 用冒泡排序实现快速排序(qsort函数),指针进阶实例

    目录   1、qsort函数是什么 2、冒泡排序实现指针进阶 2.1 主函数 2.2 功能函数声明​编辑 2.3 my_qsort函数介绍 2.4 Swap函数 总结           qsort函数是c语言自带的函数,其功能是实现快速排序。我们来看一下他的参数和返回值:         以上就是qsort的参数和返回值,可以看到,

    2024年02月21日
    浏览(31)
  • C/C++qsort函数的实现(冒泡排序)

     个人主页: 仍有未知等待探索_数据结构,小项目,C语言疑难-CSDN博客 专题分栏: C语言疑难_仍有未知等待探索的博客-CSDN博客 目录 一、引言 二、讲解实现 1、给整型数组排序   排序实现 总代码  2、qsort中参数cmp函数怎么实现 1.浮点型 2.结构体类型  1、第一个参数是void*b

    2024年02月07日
    浏览(30)
  • 用代码生撸qsort函数来实现冒泡排序

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

    2024年02月09日
    浏览(36)
  • 数据结构——C语言实现常见排序(插入排序、希尔排序、选择排序、堆排序、冒泡排序)

    现在是北京时间2023年6月23日13点19分,度过了一个非常愉快的端午节。由于刚从学校回家,一下子伙食强度直升了个两三个档次。这也导致我的肠胃不堪重负,我也准备等会去健身房消耗一下盈余的热量。回到家陪伴爷爷走人生最后的阶段才是我这个暑假最重要的事情。自从

    2024年02月10日
    浏览(33)
  • 【数据结构】—从冒泡排序丝滑过度快速排序(含C语言实现)

                                            食用指南:本文在有C基础的情况下食用更佳                                          🔥 这就不得不推荐此专栏了: C语言                                        ♈️ 今日夜电波:靴の花火—ヨルシカ            

    2024年02月08日
    浏览(28)
  • C语言算法——实现冒泡排序

    默认数组中的第一个数是原本数组中排好序的第一个数,然后每次将排好序的数组的后面的第一个数作为哨兵。每次哨兵都和前面的排好序的数组中的数从后往前进行比较,然后将哨兵插入到已经排好序的数组中。然后哨兵逐渐往后移动,逐步将哨兵插入到数组中,这就是

    2024年02月04日
    浏览(38)
  • 【排序算法】C语言实现选择排序与冒泡排序

    这里是阿辉算法与数据结构专栏的第一篇文章,咱们就从排序算法开始讲起,排序算法有很多大致分为两类:基于比较的排序和非比较的排序 基于比较的排序:冒泡、选择、插入、希尔、堆、归并、随机快排 非比较的排序:桶排序 以上的排序算法阿辉都会讲到,今天阿辉主

    2024年02月04日
    浏览(31)
  • 数据结构排序——详解快排及其优化和冒泡排序(c语言实现、附有图片与动图示意)

    上次讲了选择排序和堆排序:数据结构排序——选择排序与堆排序 今天就来快排和冒泡 快速排序(Quick Sort)是一种常用的排序算法,它是由英国计算机科学家Tony Hoare于1959年发明的。快速排序的基本思想是通过分治的策略将一个数组分成两个子数组,然后分别对这两个子数

    2024年01月25日
    浏览(35)
  • Go 语言实现冒泡排序算法的简单示例

    以下是使用 Go 语言实现冒泡排序算法的简单示例: 在这个例子中, bubbleSort 函数接收一个整数切片,对切片中的元素进行冒泡排序。在 main 函数中,我们定义了一个示例数组,调用 bubbleSort 函数对其进行排序,并输出结果。 注意,冒泡排序算法的时间复杂度为 O(n^2),因此对

    2024年01月23日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包