栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

#include 
#include 
#include 
#include 
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 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("%dn", arr[i]);
	}
	system("pause");
	return 0;
}

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/330092.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号