根据查阅可以看到qsort的参数和每个参数的作用;
void swap(void* p1, void* p2, int sz)//通过冒泡排序,比较后满足条件要交换数组顺序 { for (int i = 0; i < sz; i++)//对每个字符进行交换 { char temp = *((char*)p1 + i); *((char*)p1 + i) = *((char*)p2 + i); *((char*)p2 + i) = temp; } } void myqsort(void* base, int num, int sz, int (*compare)(const void*, const void*)) { for (int i = 0; i < num; i++) { for (int j = 0; j < num - i-1; j++)//冒泡排序的原理 { if (compare((char*)base + sz * j, (char*)base + sz * (j + 1) )> 0) {//强制转换成char*去寻找每个数组的位置 swap((char*)base + sz * j, (char*)base + sz * (j + 1),sz);//交换 } } } }
这样就把myqsort实现完成,下面用例子进行测试
struct stu//创造一个结构体 { char name[20]; int age; }; int cmp(const void*a,const void*b) { return *(int*)a - *(int*)b;//对整形从小到大排序 } int cmpstu(const void* a, const void* b) {//通过结构体的age排序 return ((stu*)a)->age-((stu*)b)->age; } int cmpst(const void* a, const void* b) {//通过结构体的name的ascll码值比较 return strcmp(((stu*)a)->name, ((stu*)b)->name); } int main() { stu b[5] = { "abc",6,"bcd",7,"fes",8,"afe",3,"eafa",2}; int a[5] = { 3,6,2,1,8 }; myqsort(a, 5, sizeof(int),cmp); myqsort(b, 5, sizeof(stu), cmpstu); for (int i = 0; i < 5; i++) cout << a[i]<<' '; cout << endl; cout << "结构体age排序"; for (int i = 0; i < 5; i++) cout << b[i].name<<' '<<b[i].age <<endl; myqsort(b, 5, sizeof(stu), cmpst); cout << "结构体name排序"; for (int i = 0; i < 5; i++) cout << b[i].name << ' ' << b[i].age << endl; return 0; }
测试结果