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

Posted 敲代码的小星星

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用冒泡排序模拟实现qsort函数相关的知识,希望对你有一定的参考价值。

昨天大概讲解了一下qsort函数及其简单应用。我们再看一遍qsort函数:

void qsort(void * base, int  size, int num, int(*cmp)(void *, void *));

 下面我们用冒泡排序模拟实现一下,如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//void qsort(void * base, int  size, int num, int(*cmp)(void *, void *))
struct stu
{
	char name[20];
	int age;
};
void Swap(char *buf1, char*buf2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
void Bubble_sort(void * base, int size, int width, int(*cmp)(void *, void *))
{
	int i = 0, j = 0;
	for (i = 0; i < size - 1; i++)
	{
		for (j = 0; j < size - i - 1; j++)
		{
			//强制类型转换为char *类型,用上宽度width,就可以巧妙地转到不同类型的数据
			if (cmp_int((char*)base + j*width, (char*)base + (j + 1)*width)>0)
			{
				Swap((char*)base + j*width, (char*)base + (j + 1)*width, width);
			}
		}
	}
}
int cmp_int(const void * e1, const void * e2)
{
	return  *((int *)e1) - *((int *)e2);
}
int cmp_float(const void * e1, const void * e2)
{
	return (int)(*((float *)e1) - *((float *)e2));
}
int cmp_stu_by_name(const void * e1, const void * e2)
{
	return strcmp(((struct stu *)e1)->name, ((struct stu *)e2)->name);
}
int cmp_stu_by_age(const void * e1, const void * e2)
{
	return ((struct stu *)e1)->age - ((struct stu *)e1)->age;
}
void Print1(struct stu s[3])
{
	int i = 0;
	for (i = 0; i < 3; i++)
		printf("%d ", s[i].age);
	printf("\\n");
}
void test1()
{
	int arr[] = { 4, 5, 6, 7, 8, 9, 1, 2, 3, 0 };
	int sz1 = sizeof(arr) / sizeof(arr[0]);
	Bubble_sort(arr, sz1, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < 10; i++)
		printf("%d ", arr[i]);
	printf("\\n");
}
void test2()
{
	float brr[] = { 3.0, 2.0, 4.0, 5.0, 7.0, 4.0 };
	int sz2 = sizeof(brr) / sizeof(brr[0]);
	Bubble_sort(brr, sz2, sizeof(brr[0]), cmp_float);
	int i = 0;
	for (i = 0; i < 6; i++)
		printf("%f ", brr[i]);
	printf("\\n");
}
void test3()
{
	struct stu s[3] = { { "zhangsan", 15 }, { "lisi", 23 }, { "wangwu", 8 } };
	int sz3 = sizeof(s) / sizeof(s[0]);
	Bubble_sort(s, sz3, sizeof(s[0]), cmp_stu_by_name);
	Print1(s);
}
void test4()
{
	struct stu s[3] = { { "zhangsan", 15 }, { "lisi", 23 }, { "wangwu", 8 } };
	int sz3 = sizeof(s) / sizeof(s[0]);
	Bubble_sort(s, sz3, sizeof(s[0]), cmp_stu_by_age);
	Print1(s);
}
int main()
{
	test1();
	test2();
	test3();
	test4();
	return 0;
}

今天就简单说到这了。

   作者会每天分享自己的C语言学习心得,记录自己C语言学习之路,欢迎大家指正,感谢支持~

 

 

以上是关于用冒泡排序模拟实现qsort函数的主要内容,如果未能解决你的问题,请参考以下文章

用冒泡排序来模拟实现qsort函数

模拟qsort实现冒泡排序

c语言重要库函数解读 和模拟实现————Qsort

爆肝!回调函数的实用案例,建议收藏~(计算器改良,qsort快排函数应用实例,冒泡函数核心理解,模拟qsort函数)

C语言之qsort函数进行排序

C语言篇 + 指针进阶练习 + qsort模拟实现(回调函数思想) + 指针和数组笔试题