C语言实现用冒泡排序实现qsort函数

C语言实现用冒泡排序模拟实现qsort函数


C语言实现用冒泡排序实现qsort函数的前提我们需要知道冒泡排序和sqort函数的思路分析。
接下来我们先了解冒泡排序。

冒泡排序

冒泡排序算法

冒泡排序的算法非常简单就是——两两相邻的元素进行比较

冒泡排序的思路分析

1.要清楚冒泡排序需要进行几趟排序

2.要了解冒泡排序每一趟需要进行排序几对

如果前面的数大于后面的数就要进行交换。
第一趟已经排序好了一个数字,因此第二趟是数字个数减1
在这里插入图片描述

冒泡排序的代码实现

int main()
{
	int arr[] = {3,2,5,6,1,4};
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;=
	printf("冒泡排序前:");

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

	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 tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}

	printf("冒泡排序前:");
	for (i = 0; i < sz; i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
	return 0;
}

效果图如下:
在这里插入图片描述

qsort函数

qsort函数是C语言标准库中的一个排序函数,用于对数组进行快速排序。它的原型定义在头文件stdlib.h中,函数签名如下:

void qsort(void base,
size_t nmemb,
size_t size,
int (compar)(const void , const void ));
//------------------------------------------------------------------------------
qsort函数有四个参数分别是:
/void qsort (void base, //待排序的数组
size_t num, //待排序数组的元素个数
size_t size,//待排序数组一个元素的大小
int (compar)(const void,const void
));//比较函数
/

qsort函数的思路分析

1.qsort函数可以排序任意类型的数据,当然比较函数需要我们自己去编写。比较函数返回值说明
在这里插入图片描述

< 0 elem1小于elem2

==0 elem1等于elem2

.>0 elem1大于elem2

数组按照比较函数定义的递增顺序排序。要按降序对数组进行排序,请颠倒比较函数中“大于”和“小于”的含义。

qsort函数排序实现的代码实现

int cmp_arr(const void* e1, const void* e2)
{
	/*比较函数的两个形参必须是void*类型的*/
	/* void* 可以接受任意类型的元素,但是进行相关的运算 */
	return *(int*)e1 - *(int*)e2;
}


void print_arr(int arr[], int sz)/* 打印函数 */
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[] = {4,1,2,6,3,5,7,9,8,0};
	int sz = sizeof(arr) / sizeof(arr[0]);/* 求数组元素个数 */

	printf("排序前:");
	print_arr(arr, sz);

	qsort(arr, sz, sizeof(arr[0]), cmp_arr);
	printf("排序后:");

	print_arr(arr, sz);

	return 0;
}

用冒泡排序模式实现qsort函数

我们需要用冒泡排序的思路来实现qsort函数的功能。
冒泡排序算法,就是两两相邻的两个数进行比较和交换。
需要注意的地方

1.其中的void是可以接受任意类型,但是不能进行运算。
2.char
可以访问一个字节的空间,加多少个字节跳过多少个字节的空间,例如
char*+4相当于跳过一个整型的大小
3.比较函数是需要强制转换类型的。
4.第二个for循环里面我们需要判断是比较函数的返回值
5.交换函数那里循环完就交换了一个类型的数据。

用冒泡排序实现qsort函数的代码实现

//***********************************************************************
int cmp_int(const void* e1, const void* e2)/* 比较函数 */
{
	/* 因为两个形参的是viod*类型 所以需要强制类型转换 */
	return *(int*)e1 - *(int*)e2;
}

void Swap(char* base1, char* base2, size_t width)/* 交换函数 */
{
	/* 以字节个数交换 */
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *base1;
		*base1 = *base2;
		*base2 = tmp;
		base1++;
		base2++;
	}
}

void Bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void*, const void*))
{
	int i = 0;
	int j = 0;
	//趟数
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			//进行比较
			/* char* 指针可以访问一个字节的空间,因此所有的参数强制转换为char*类型 */


			if(cmp((char*)base + j * width, (char*)base + (j + 1) * width)>0)/*这里判断的是比较函数返回值*/
			{
				Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
			}
		}
	
	}
}


void test()
{
	int array[] = {1,3,6,5,4,2,0,7,9,8};

	int sz = sizeof(array) / sizeof(array[0]);

	Bubble_sort(array,sz,sizeof(array[0]),cmp_int);

	print_arr(array, sz);
}

int main()
{
	test();//用冒泡排序的思路来实现qsort函数
	return 0;
}

总结

写完这文章,我更加深刻理解了冒泡排序和qsort函数的算法。同时也给我带来小小的成就感。希望看完这篇文章帅哥美女,对你有所帮助。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值