目录
1.qsort函数的使用
1.1 qsort函数参数介绍
void qsort( void *base,//你要排序的数据的起始位置
size_t num,//待排序的数据元素的个数
size_t width, //待排序的数据元素的大小(单位是字节)
int (__cdecl *compare )(const void *elem1, const void *elem2 ) );//函数指针-比较函数
1.2qsort函数的使用
头文件的调用:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
qsort排序的各种类型:
//int类型的比较
int cmp1(const void* p1, const void* p2)
{
return *(int*)p1 - *(int *)p2;
}
void test1()
{
int arr1[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
int i = 0;
qsort(arr1, 10, sizeof(int), cmp1);
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
}
//char类型的比较
int cmp2(const void* p1, const void* p2)
{
return *(char*)p1 - *(char *)p2;
}
void test2()
{
char arr2[5] = { 'N', 'E', 'A', 'V', 'B' };
int i = 0;
qsort(arr2, 5, sizeof(char), cmp2);
for (i = 0; i < 5; i++)
{
printf("%c ", arr2[i]);
}
printf("\n");
}
//浮点类型的比较
int cmp3(const void* p1, const void* p2)
{
return (int)(*(float*)p1 - *(float *)p2);
}
void test3()
{
float arr3[] = { 1.0f, 0.9f, 2.1f, 3.1f, 5.1f };
int i = 0;
qsort(arr3, sizeof(arr3) / sizeof(arr3[1]), sizeof(float), cmp3);
for (i = 0; i < 5; i++)
{
printf("%f ", arr3[i]);
}
printf("\n");
}
//结构体类型的比较
typedef struct student
{
char name[20];
int age;
}stu;
int cmp4(const void* p1, const void* p2)
{
return strcmp(((stu*)p1)->name, ((stu*)p2)->name);
}
int cmp5(const void* p1, const void* p2)
{
return ((struct student*)p1)->age - ((struct student*)p2)->age;
}
void test4()
{
stu arr4[3] = { "zhangsan", 14, "lisi", 12, "angwu", 11 };
int i = 0;
qsort(arr4, 3, sizeof(stu), cmp4);
qsort(arr4, 3, sizeof(stu), cmp5);
for (i = 0; i < 3; i++)
{
printf("%d ", arr4[i].age);
printf("%s ", arr4[i].name);
}
printf("\n");
}
主函数:
int main()
{
test1();
test2();
test3();
test4();
return 0;
}
2.qsort函数通过冒泡排序实现
void swap(char* buf1,char* buf2,int width)
{
int i;
for (i = 0; i < width; i++)
{
char temp = *buf1;
*buf1 = *buf2;
*buf2 = temp;
buf1++;
buf2++;
}
}
void bubble_qsort(void *base, size_t num, size_t width, int(*cmp)(const void*p1, const void*p2))
{
int i, j;
for (i = 0; i< num; i++)
{
int flag = 1;
for (j = 0; j < num - 1 - i; j++)
{
if (cmp((char*)base + j*width, (char*)base + (j + 1)*width)>0)
{
swap((char*)base + j*width, (char*)base + (j + 1)*width, width);
//这里表示前面一个元素与后面一个元素相差一个类型,width就是字节的大小 首地址+字节的大小=元素类型
//j*width是为了确定前后元素地址的变化
}
flag = 0;
}
if (flag == 1)
{
break;
}
}
}
int cmp(const void*p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
int main()
{
int arr[5] = { 8, 2, 0, 5, 7 };
bubble_qsort(arr, 5, sizeof(arr[0]), cmp);
int i;
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
总结:1.qsort函数通过冒泡排序实现,首先应该知道用void的指针来接受任意类型的数组的首元素地址,然后将其转化为char类型的指针,由于char*的指针进行解引用一次访问一个字节,那么就能实现通过char*指针对数字一个字节一个字节的替换。例如冒泡就是每次交换的是4字节,我们的思想是将四字节变小成一字节来处理,就是将不同类型强制转换为char*指针来接受然后进行处理。
2.这里需要函数调用(因为不同人会用不同的类型,所以我们需要他自己确定好类型,让他自己写个比较函数),然后就是理解参数的运用。
-------如有不妥之处还请指正