qsort学习及改造冒泡排序能排序任何数
- qsort的使用
qsort的使用
这个函数也不是很复杂!!!
qsort(void*base,size_t num,size_t width,int(int (__cdecl *compare )(const void *elem1, const void *elem2 )))
void * base,为数组的基地址,size_t num为数组的元素个数,size_t width 元素的大小,也就是偏移量,int(int (__cdecl *compare )(const void *elem1, const void *elem2 ))这个是函数指针,用来接受函数的地址,elem1指向第一个比较元素的地址,elem2指向第二个比较元素的地址!!!
int cmp_int(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
int main()
{
int arr[10] = { 5,3,2,1,6,7,9,8,4,0 };
int sz = sizeof(arr) / sizeof(int);
qsort(arr, sz, sizeof(int), cmp_int);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
下面模拟的通用的冒泡排序!!!
void Swap(char* buffer1, char* buffer2, size_t width)
{
for (int i = 0; i < width; i++)
{
char tmp = *buffer1;
*buffer1 = *buffer2;
*buffer2 = tmp;
buffer1++;
buffer2++;
}
}
void bubble_sort(void* base,size_t num,size_t width,int (*cmp)(const void* p1,const void* p2))
{
for (int i = 0; i < num-1; i++)
{
for (int j = 0; j < num - 1 - i; j++)
{
//把每次比较的元素的首地址,传到p1和p2;
if ((*cmp)((char*)(base)+j * width, (char*)(base)+(j + 1) * width) > 0) {
//交换
Swap((char*)(base)+j * width, (char*)(base)+(j + 1) * width,width);
}
}
}
}
int cmp_int(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
int main()
{
int arr[10] = { 5,3,2,1,6,7,9,8,4,0 };
int sz = sizeof(arr) / sizeof(int);
bubble_sort(arr, sz,sizeof(int),cmp_int);
for (int i = 0; i < sz; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
完结!!!