用冒泡实现各种数据的排序(qsort函数的模拟实现)

  qsort函数的介绍与使用已在前面博客写过:函数 qsort 详解 ,这篇博客我们用冒泡排序模拟实现一下qsort函数。

首先我们实现一个冒泡排序的函数

void Bubblesort(int* a, int sz)//sz为数组元素个数 
{
	int i = 0, j = 0,tmp;
	for (j = 0; j < sz; j++)
	{
		for (i = 0; i < sz - 1 - j; i++)
		{
			if (a[i] > a[i + 1])
			{
				tmp = a[i];
				a[i] = a[i + 1];
				a[i + 1] = tmp;
			}
		}
	}
}

我们用冒泡排序的方式实现qsort

void Swap(char*x,char*y,int sz)
{
	int i = 0;
	char tmp = 0;
	for (int i = 0; i < sz2; i++)
	{
		tmp = *x;
		*x = *y;
		*y = tmp;
		y++;
		x++;
	}
}
void Bubblesort(void*a,int sz1,int sz2,int (*compare)(const void *x,const void*y ))
{
	char* b = (char*)a;
	for (int j = 0; j < sz1; j++)
	{
		for (int i = 0; i < sz1 - 1 - j; i++)
		{
			int flag = compare(b + (i * sz2), b + ((i + 1) * sz2));
			if (flag<0)
			{
				Swap(b + (i * sz2), b + ((i + 1) * sz2),sz2);
			}
		}
	}
}

 我们先看一下Bubblesort函数

void Bubblesort(void*base,int sz1,int sz2,int (*compare)(const void *x,const void*y ))

它有四个参数

  • base-- 指向要排序的数组的第一个元素的指针。
  • sz1 -- 由 base 指向的数组中元素的个数。
  • sz2 -- 数组中每个元素的大小,以字节为单位。
  • compare -- 函数指针,用来接受比较两个元素的函数,该函数使用者自己实现。

尤其需要注意的是第四个参数,compare,它是需要根据数组中元素不同类型单另实现的函数。

 我们在看一下Swap函数

void Swap(char*x,char*y,int sz)

x,y是用来接收要被比较的两个数的地址,sz是数据的大小,单位为字节。

下来我们看一下compare函数的实现

int compare (const void *x,const void*y )

参数只有两个,x和y,要比较的两个数据的地址

排整型和浮点型

int compare(const void* x, const void* y)
{
	return *(int*)x - *(int*)y;
}

排字符串

int compare(const void* x, const void* y)
{
	strcmp((char*)x, (char*)y);
}

对结构体数组排序其实也是对以上三种类型的排序。

建立一个结构体

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

按名字排序

int cmp_stu_age(const void* x, const void* y)
{
	strcmp(((struct stu*) x)->name , ((struct stu*)y)->name);
}

按年龄排序

int cmp_stu_age(const void* x, const void* y)
{
	return  (((struct stu*) x)->age- ((struct stu*)y)->age);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值