任意类型排序

发布时间:2020-07-12 17:08:09 作者:我是你帆哥
来源:网络 阅读:549

模拟qsort()函数,实现任意类型排序:

 qsort()简介:

 原型:

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 )

base:要排序的的数组的首地址


num:要排序的元素的个数


width:元素所占的字节数


compare:函数指针,指向排序方式这个函数的指针。其中比较方式这个函数需要用户根据自己的需要


使用qsort要调用<stdlib.h>


实现:

#include<stdio.h>
#include<stdlib.h>
int compare(const void *elem1, const void *elem2)   //比较方式
{
	const int *str1 = (const int *)elem1;
	const int *str2 = (const int *)elem2;
	return *str1>*str2;                         //">"升序,“<"降序
}
void sort(void *base, size_t num,size_t byte, int(*cmp)(const void *elem1, const *elem2))
{
	char *str = (char *)base;
	int flag = 0;
	const void *p1;
	const void *p2;
	for (size_t i = 0; i < num - 1; i++)
	{
		flag = 0;
		for (size_t j = 0; j < num - 1 - i; j++)
		{
	           p1 =(const void *)(str+(j*byte));
	           p2 = (const void *)(str+(j + 1)*byte);
	           if (cmp(p1,p2))
		   {
		      for (size_t k = 0; k < byte; k++)           //按字节交换
		      {
			str[j*byte + k] = str[j*byte + k] + str[(j + 1)*byte + k];
			str[(j+1)*byte + k] = str[j*byte + k] - str[(j + 1)*byte + k];
			str[j*byte + k] = str[j*byte + k]-str[(j + 1)*byte + k];
		      }
		      flag = 1;
		}
	}
	if (!flag)
	break;
	}
}
int main()
{
	int(*cmp)(const void *elem1, const *elem2)=compare;
	int arr[4] = { 20,40,5, 4 };
	sort(arr,4,4, cmp);
	for (int i = 0; i < 4; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}


推荐阅读:
  1. 单播、组播、任意播
  2. 巧用 ROW_NUMBER() 生成不重复的唯一排序码,按客户的需要任意排序数据

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

模拟 qsort

上一篇:Windows SERVER 2012 R2调整网卡优先级顺序的一个好方法

下一篇:Centos7.6 使用二进制安装docker

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》