c---冒泡排序模拟qsort

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

一、冒泡排序

二、冒泡排序优化排各种类型数据


冒泡排序

冒泡排序原理:两两相邻元素进行比较
qsort未定义标识,c语言,排序算法,算法
qsort未定义标识,c语言,排序算法,算法

初级版

void bulle_sort(int* a, int sz)
{
	int i = 0;
	for (int i = 0; i < sz-1; i++)
	{
		int j = 0; 
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (a[j] > a[j+1])
			{
				int tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;

			}
		}
	}
}

这是冒泡排序初级版,不管其原内容是否有序都会进行比较,如果原内容原本就是有序的,再每个都进行比较效率就会低下,那么这时候可以改进一下,想一个标记变量来记录是否有序,如int
falg = 0; 如果无序的情况下falg会变为1,有序的情况下falg保持0不变,如果一趟下来falg 为0
不变,那么就是有序的就不用再比较后面趟数了,这样使其在有序的情况下时间复杂度为O(n),大大提高了效率

改进版

void bulle_sort(int* a, int sz)
{
	int i = 0;
	int falg = 0;
	for (int i = 0; i < sz-1; i++)
	{
		int j = 0; 
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (a[j] > a[j+1])
			{
				int tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
				falg = 1;
			}
		}

		if (falg == 0)
		{
			break;
		}
	}
}

冒泡排序优化排各种类型数据
上面冒泡排序可以发现只能够排序整形
qsort未定义标识,c语言,排序算法,算法
那要是我们想利用冒泡来排其他不同类型应该如何实现呢?这里就引入c语言里的一个库函数qsort(),在cplusplus上搜索qosrt

qsort未定义标识,c语言,排序算法,算法
qsort未定义标识,c语言,排序算法,算法
qsort未定义标识,c语言,排序算法,算法

可以发现这是一个排序函数,且qsort函数有四个参数,void * base目标数组,待排序的起始地址,size_t num待排序数组大小,size_t表示无符号类型,由于数组大小不可能为负数,因此设置为size_t更为合适,size_t size,数组中每个元素是多少字节,其实就是每个元素是什么类型
qsort未定义标识,c语言,排序算法,算法

int (*compar)(const void*,const void*)

这是一个函数指针,是比较函数的函数指针,而comper实现的是比较功能,
qsort未定义标识,c语言,排序算法,算法
比较函数qsort未定义标识,c语言,排序算法,算法

由于比较类型不知道是什么类型的,因此用void*,这里这个设计十分合理,void*,void*存的是要比较两个元素的地址,是因为设计者在设计时不知道我们要比较什么类型的,因为void*指针可以接收任意类型变量的地址。comper函数返回类型为in类型,第一个比第二个于返回1,相等返回0,小于返回-1

qsort未定义标识,c语言,排序算法,算法
qsort函数运用

int comper(const void* s1, const void* s2)
{
	return *((int*)s1) - *((int*)s2);//由于我们自己使用时知道了是什么类型,因此强转为该类型就可,
	//然后再对其解引用就可以相互进行比较了
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//bulle_sort(arr, sz);
	qsort(arr, sz, sizeof(arr[0]), comper);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

qsort未定义标识,c语言,排序算法,算法

可以发现出了警告是qsort未定义,这是因为没有包含它所需的头文件

qsort未定义标识,c语言,排序算法,算法

可以往下翻找到它该用什么头文件
以qsort排序结构体

#include<string.h>
typedef struct Stu
{
	char name[20];
	int age;
}Stu;
int comper_stu_by_name(const void* s1, const void* s2)
{
	//按照名字比较,两个字符串比较是不能直接相减,用库函数strcmp进行比较
	//强制类型转换为结构体指针,然后再->找到结构体成员变量name
	return strcmp(((Stu*)s1)->name , ((Stu*)s2)->name);//由于我们自己使用时知道了是什么类型,因此强转为该类型就可,
	//得到其地址再对其解引用就可以相互进行比较了
}

int main()
{
	Stu s[3] = { {"zhangsan",20},{"wangwu",30},{"lisi",50} };
	qsort(s, sizeof(s)/sizeof(s[0]), sizeof(s[0]), comper_stu_by_name);
	for (int i = 0; i < sizeof(s)/sizeof(s[0]); i++)
	{
		printf("%s %d\n", s[i].name, s[i].age);
	}
}

qsort未定义标识,c语言,排序算法,算法
strcmp比较字符串函数
qsort未定义标识,c语言,排序算法,算法
qsort未定义标识,c语言,排序算法,算法

strcmp返回类型为int
qsort可以实现任意类型的数据的排序;

以冒泡模拟qsort

//比较时需要比较什么类型自己可以定义,然后强转
//需要排不同类型只需要在这里更改就可以了
int comper(void* s1, void* s2)
{
	return *((int*)s1) - *((int*)s2);
}

void swap(char* buf1, char* buf2, int width)
{
	int i = 0;
	//width是数组中每个元素的字节大小,其实以我们来看,知道width就可以知道是什么类型,
	for (i = 0; i < width; i++)
	{
		//将每个字节都交换
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}

//与qsort函数内部一致
//比较类型不明确,所有void*
void bulle_qsort( void* a, size_t sz, size_t width, int (*comper)(const void* s1, const void* s2))
{
	size_t i = 0;
	int falg = 0;
	for (int i = 0; i < sz-1; i++)
	{
		size_t j = 0; 
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (comper((char*)a+j*width,(char*)a+(j+1)*width)>0)//实现比较,交换,且由于不知道要比较什么类型,,那么我们只有使用偏移量比较
			{
				swap((char*)a + j * width, (char*)a + (j + 1) * width, width);//由于不知道类型,那么就交换每个字节,把每个元素大小传过去
				falg = 1;
			}
		}

		if (falg == 0)
		{
			break;
		}
	}
}

int main()
{
	int a[] = { 9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(a) / sizeof(a[0]);
	//这里可以排任意类型的数据,我这里以整形数组模拟
	
	bulle_qsort(a, sizeof(a) / sizeof(a[0]), sizeof(a[0]), comper);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

qsort未定义标识,c语言,排序算法,算法
冒泡模拟实现qsort就到这里了,有兴趣的小伙伴可以区试试其他类型的排序吧文章来源地址https://www.toymoban.com/news/detail-801015.html

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

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

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

相关文章

  • 【C语言】解析C语言实现排序的算法(冒泡排序、插入排序、选择排序、快速排序、归并排序)

    本博客主要围绕五种常见的排序算法展开讨论,包括选择排序、快速排序、归并排序、冒泡排序和插入排序。针对每种算法,我对其思想、特点、时间复杂度、稳定性以及优缺点进行了详细解释和比较。 冒泡排序算法是一种简单且常用的排序算法。它通过重复地交换相邻的元

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

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

    2024年01月23日
    浏览(35)
  • 快速了解四种排序算法:希尔排序,堆排序,快速排序,冒泡排序(c语言)

     一个程序员一生中可能会邂逅各种各样的算法,但总有那么几种,是作为一个程序员一定会遇见且大概率需要掌握的算法。 1.1算法(algorithm ) 是指令的集合,是为解决特定问题而规定的一系列操作。 它是明确定义的可计算过程,以一个数据集合作为输入,并产生一个数据

    2024年02月16日
    浏览(42)
  • C语言入门:冒泡法排序、交换法排序和选择法排序算法的详解(代码分析)

     冒泡法排序 :顾名思义,小的数据就好像水中的气泡一样总是逐渐往上升, 大的数据就像石块一样往下沉,因此称为冒泡法排序法。 假如有n个数字,则需要进行n-1轮  第一轮结果:最大的数,被放在了最后一位  第二轮:元素 ‘8’ 已经拍好了顺序,所以只用将前4个元素

    2024年02月03日
    浏览(36)
  • C语言实现八大排序算法(详解插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序(递归和非递归)、归并排序(递归和非递归)和计数排序)

    本篇文章使用C语言实现了数据结构中常见的八大排序算法,它们分别是 插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序和计数排序 。在排序算法的实现过程中,每种算法都有其独特的特点和适用场景。插入排序通过逐步构建有序序列来排序,希尔

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

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

    2024年02月16日
    浏览(43)
  • c---冒泡排序模拟qsort

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

    2024年01月18日
    浏览(31)
  • 模拟实现qsort函数(采用冒泡排序的方式)

    前言: 之前我在C语言:指针详解【进阶】后篇中提到了 qsort函数 , qsort函数 作为一个库函数,在我们日常的代码编写中可能会用到,在上面提到的文章中我们也进行使用了这个函数,大家也了解了一些这个函数的使用方法,但我们作为学习者,我们不仅要会用,还要知道这

    2024年02月05日
    浏览(33)
  • 【数据结构与算法】排序算法:冒泡排序,冒泡排序优化,选择排序、选择排序优化

    目录 一、冒泡排序 1、冒泡排序思想 2、冒泡排序算法的性能分析 代码实现: 二、选择排序 1、选择排序思想 2、选择排序算法的性能分析  代码实现: 1、冒泡排序思想 冒泡排序的基本思想是通过相邻元素之间的比较和交换来逐步将最大(或最小)的元素移到右边(或左边

    2024年01月19日
    浏览(38)
  • C++常见排序算法——冒泡排序算法

    首先说一下冒泡排序的基本算法思想: 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸

    2023年04月08日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包