模拟qsort函数的实现

前言:我们都已经知qsort能够帮我们排多种多样的数组,作为一名编程小白,自然就要探讨【qsort】究竟是怎么实现的?接下来我们就来模拟实现qsort函数的实现。

1.主函数

首先,我们先随便给定一个主函数,数组给个整型数组。

int main() {

	int sz;
	int arr[] = { 9,8,7,6,5,4,3,2,1 };//需要排的数组
	sz = sizeof(arr) / sizeof(arr[0]);

	mock_qsort(arr, sz, sizeof(arr[0]), compare_element);//待实现qsort排序
	print(sz, arr);//打印数组

	return 0;
}

mock_qsort 实现t

传什么类型参数自然用什么类型形参

传参以及如何找到每一个元素

void mock_qsort(void* pa, int el_sum, int el_size, int (*compare)(const void* e1, const void* e2)) {

	int i = 0;
	for (i = 0; i < el_sum - 1; i++) {
		int j = 0;//排序次数
		for (j = 0; j < el_sum - 1 - i; j++) {
			
			//我不知道void*pa将会是一个什么类型的指针,于是将索性将强制转化成char*(+1跳过1字节)
			//的指针,再根据每个元素大小找到下一个元素
			if (compare((char*)pa + j * el_size, (char*)pa + (j + 1) * el_size) > 0) {
			
			//将需要交换元素首字节地址传过去,与地址
				swap((char*)pa + j * el_size, (char*)pa + (j + 1) * el_size, el_size);
			}
		}
	}
}

实现比较元素大小

int compare(const void*pa1,const void*pa2) {
	return *(int*)pa1 - *(int*)pa2;
}

如何实现元素的交换

实现元素的交换(既然是字符型地址,+1自然跳过一个字节,我们交换元素可以将每一个字节都交换,这样元素自然也就交换了
每一个字节的交换就是元素的交换

void swap(char* pa1, char* pa2, int element_size) {
	int i = 0;
	for (i = 0; i < element_size; i++) {
		char store = *pa1;
		*pa1 = *pa2;
		*pa2 = store;
		pa1++;
		pa2++;
	}
}

最后我们再实现一个打印函数pirnt即可

void print(int sz, int* arr) {
	for (int i = 0; i < sz; i++) {
		printf("%d ", *(arr + i));
	}
}

2.完整代码

int compare(const void*pa1,const void*pa2) {
	return *(int*)pa1 - *(int*)pa2;
}


void print(int sz, int* arr) {
	for (int i = 0; i < sz; i++) {
		printf("%d ", *(arr + i));
	}
}


void swap(char* pa1, char* pa2, int element_size) {
	int i = 0;
	for (i = 0; i < element_size; i++) {
		char store = *pa1;
		*pa1 = *pa2;
		*pa2 = store;
		pa1++;
		pa2++;
	}
}

void mock_qsort(void* pa, int el_sum, int el_size, int (*compare)(const void* e1, const void* e2)) {
	int i = 0;
	for (i = 0; i < el_sum - 1; i++) {
		int j = 0;
		for (j = 0; j < el_sum - 1 - i; j++) {
			if (compare((char*)pa + j * el_size, (char*)pa + (j + 1) * el_size) > 0) {
				swap((char*)pa + j * el_size, (char*)pa + (j + 1) * el_size, el_size);
			}
		}
	}
}


int main() {

	int sz;
	int arr[] = { 9,8,7,6,5,4,3,2,1 };
	sz = sizeof(arr) / sizeof(arr[0]);

	mock_qsort(arr, sz, sizeof(arr[0]), compare);
	print(sz, arr);

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡涂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值