上一篇写到库函数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这个函数只是用来比较整型数据用的,如果要比较其他类型的数据,那么其中在对指针进行强转时就要注意类型了,因为当解引用时,指针类型的不同,决定了取多少个字节内容。运行结果如下:



