模拟实现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;
}