C语言用冒泡排序模拟实现库函数qsort

上一篇写到库函数qsort的调用,那么这个函数将如何由我们自己来模拟实现呢?下面就用简单的排序方法冒泡排序来模拟实现qsort函数。

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <assert.h>
int ComInt(const void * xp,const void * yp){
	assert(xp);
	assert(yp);
	const int * x = (const int *)xp;
	const int * y = (const int *)yp;
	if (*x > *y){
		return 1;
	}
	else if (*x < *y){
		return -1;
	}
	return 0;
}
void Exchange(char *data, char *data1,size_t size){
	for (int i = 0; i < size; i++){//因为data是char *型的,所以一次解引只交换一个字节,而要比较的数据占的大小由size决定
		*data ^= *data1;
		*data1 ^= *data;
		*data ^= *data1;
		data++;
		data1++;
	}
}
void Myqsort(void *base, size_t num, size_t size, int(*compar)(const void *, const void *)){
	assert(base);
	assert(compar);
	char * base1 = (char *)base;//将指针强转成char *型,解引用就是1个字节
	for (int i = 0; i < num-1; i++){
		for (int j = 0; j <num-1-i; j++){
			if (compar(base1+j*size, base1 +(j+1)*size )>0){//将相邻两个元素的地址传递给ComInt
				Exchange(base1 + j*size, base1 + (j+1)*size,size);
			}
		}
	}

}
int main(){
	int arr[] = { 2,6, 5, 3, 1, 5, 7, 8, 9, 45, 5 };
	size_t num = sizeof(arr) / sizeof(arr[0]);
	Myqsort(arr, num, sizeof(int), ComInt);
	for (int i = 0; i < num; i++){
		printf("%d\n", arr[i]);
	}
	system("pause");
	return 0;
}

在Myqsort函数中,首先会把传递过来的指针全部强转成char *型,因为不知道到底传递的是什么类型的数据,但是数据所占的字节数是由size决定的,在冒泡排序中,巧妙地运用了size这个值,这时指针加上size就相当于找到了下一个元素的起始地址(跟指针运算有关)。而在Exchange函数中,指针变量也是char *型的,此时是按字节进行交换,交换的次数也跟size有关。

注意:ComInt这个函数只是用来比较整型数据用的,如果要比较其他类型的数据,那么其中在对指针进行强转时就要注意类型了,因为当解引用时,指针类型的不同,决定了取多少个字节内容。运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值