模拟实现qsort函数

模拟实现qsort函数

首先 来个函数原型:

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

头文件
##include<stdio.h>
#include<string.h>
#include<stdlib.h>

实现

int cmp_string(const void* x_, const void *y_)
{
	char **x = (char**)x_;
	char **y = (char**)y_;

	return strcmp(*x, *y);//由于strcmp函数的参数字符串首地址,所以进行解引用,访问元素(字符串首地址);
}
int main()
{
	char* base[] = {"wo","yi","ding","yao","nong","chu","lai"};
	int i = 0;
	//传参时,传入字符指针数组,数组长度,类型大小(由于数组里存放的是指针,所以类型要传指针大小,回调函数
	qsort(base, sizeof(base) / sizeof(base[0]), sizeof(char*), cmp_string);
	

	for (i = 0; i < sizeof(base) / sizeof(base[0]); i++)
	{

		printf("%s\n", *(base+i));
	}
	return 0;
}

#####my qsort

#define _CRT_SECURE_NO_DEPRECATE 1

#include<stdio.h>
#include<string.h>
int cmp_string(const void* x_, const void *y_)
{
	char **x = (char**)x_;
	char **y = (char**)y_;

	return strcmp(*x, *y);//由于strcmp函数的参数字符串首地址,所以进行解引用,访问元素(字符串首地址);
}
void swap(void* x_, void* y_, int size)
{
	char* x = (char*)x_;
	char* y = (char*)y_;
	int i = 0;

	for (i = 0; i < size; i++)
	{
		*(x + i) ^= *(y + i);
		*(y + i) ^= *(x + i);
		*(x + i) ^= *(y + i);
	}
}
//void*可以指向任何类型的数据, 
void myqsort(void *base_, int sz, int size, int(*cmp_string)(const void*, const void*))
{
	char** base = (char**)base_;//传入一个指针数组,应该用 char** 来接,所以进行强制类型转换
	int i = 0;
	for (; i < sz - 1; i++)  //用冒泡的思想模拟实现;
	{
		int j = 0;
		for (j=0; j < sz - 1 - i; j++)
			if (cmp_string(base+j, (base + j+1)) > 0)//使用回调函数 传入参数
			{
				swap(base+j, base + j+1,size);
			}
	}
}

//模拟实现qsort
int main()
{
	char* base[] = {"wo","yi","ding","yao","nong","chu","lai"};
	int i = 0;
	//传参时,传入字符指针数组,数组长度,类型大小(由于数组里存放的是指针,所以类型要传指针大小,回调函数
	mysqort(base, sizeof(base) / sizeof(base[0]), sizeof(char*), cmp_string);
	

	for (i = 0; i < sizeof(base) / sizeof(base[0]); i++)
	{

		printf("%s\n", *(base+i));
	}
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值