一、qsort函数介绍
- 所属库函数:<stdlib.h>
- 参数:
- 第一个参数是所要排序的数组。
- 第二个参数是一共有多少个数据要进行排序。
- 第三个参数是每个数据的类型为多少字节。
- 第四个参数是函数指针,需要自己写一个比较函数。
3.返回值:void
注:比较函数的返回值是int类型,如果返回值为>0的数,则为降序,<0为升序。
二、qsort函数的基本用法
2.1、对int类型排序
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int cmp_int(const void* f1, const void* f2)
{//降序return *(int*)f1 - *(int*)f2;
}
void test1()
{int arr[] = { 5,6,9,8,2,1,4 };int sz1 = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz1, sizeof(int), cmp_int);for (int i = 0; i < sz1; i++)cout << arr[i] << " ";cout << endl;
}
int main()
{test1();return 0;
}
打印结果:
2.2、对实型(double,float)排序
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int cmp_double(const void* f1, const void* f2)
{double diff = *(double*)f1 - *(double*)f2;if (diff > 0) return 1;else if (diff == 0) return 0;else return -1;
}
void test2()
{double brr[] = { 1.5,5.2,4.6,8.6,8.4 };int sz2 = sizeof(brr) / sizeof(brr[0]);qsort(brr, sz2, sizeof(double), cmp_double);for (int i = 0; i < sz2; i++)cout << brr[i] << " ";cout << endl;
}
int main()
{test2();return 0;
}
打印结果:
2.3、对字符数组排序
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int cmp_str(const void* f1, const void* f2)
{return strcmp((char*)f1, (char*)f2);
}
void test3()
{char words[][10] = { "eyfg","thrt","trwh","dsfr" };int sz3 = sizeof(words) / sizeof(words[0]);qsort(words, sz3, sizeof(words[0]), cmp_str);for (int i = 0; i < sz3; i++)cout << words[i] << " ";cout << endl;
}
int main()
{test3();return 0;
}
打印结果:
2.4、对结构体成员排序
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
typedef struct stu
{char name[20];int age;
}stu;
int cmp_by_age(const void* f1, const void* f2)
{return ((stu*)f1)->age - ((stu*)f2)->age;
}
int cmp_by_name(const void* f1, const void* f2)
{return strcmp(((stu*)f1)->name, ((stu*)f2)->name);
}
void test4()
{stu people[] = { {"hjegf", 58}, {"yagfe", 54} };int sz4 = sizeof(people) / sizeof(people[0]);qsort(people, sz4, sizeof(stu), cmp_by_age);for (int i = 0; i < sz4; i++)cout << people[i].age << " ";cout << endl;qsort(people, sz4, sizeof(stu), cmp_by_name);for (int i = 0; i < sz4; i++)cout << people[i].name<< " ";cout << endl;
}
int main()
{test4();return 0;
}
打印结果:
2.5、对指针数组排序
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int cmp_str_ptr(const void* f1, const void* f2)
{return strcmp(*((char**)f1), *((char**)f2));
}
void test5()
{//字面量不可修改,用constconst char* words[] = { "banana", "apple", "cherry" };int sz5 = sizeof(words) / sizeof(words[0]);qsort(words, sz5, sizeof(char*), cmp_str_ptr);for (int i = 0; i < sz5; i++)cout << words[i] << " ";cout << endl;
}
int main()
{test5();return 0;
}
打印结果:
三、qsort函数模拟实现
使⽤回调函数,模拟实现qsort(采⽤冒泡的⽅式)。
#include <stdio.h>
int int_cmp(const void * p1, const void * p2)
{ return (*( int *)p1 - *(int *) p2);
}
void swap(void *p1, void * p2, int size)
{ int i = 0; for (i = 0; i< size; i++) { char tmp = *((char *)p1 + i); *(( char *)p1 + i) = *((char *) p2 + i); *(( char *)p2 + i) = tmp; }
}
void bubble(void *base, int count , int size, int(*cmp )(void *, void *))
{ int i = 0; int j = 0; for (i = 0; i< count - 1; i++) { for (j = 0; j<count-i-1; j++) { if (cmp ((char *) base + j*size , (char *)base + (j + 1)*size) > 0) { swap(( char *)base + j*size, (char *)base + (j + 1)*size, size); } } }
}
int main()
{ int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 }; int i = 0; bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp); for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { printf("%d ", arr[i]); }printf("\n"); return 0;
}
ps:由于实现者并不知道你所要比较的数据类型是什么,所以设计成char*的比较形式,按最小字节来进行比较(大小端也有类似用法)。