qsort函数
qsort函数是基于快速排序的方法。
void qsort(void *base,size_t num,size_t width,int (_cdecl *compare)int compare(const void *a,const void *b))
第一个参数,base是需要排序的目标数组名。
第二个参数,num是参与排序数目个数
第三个参数,width是单个元素大小,推荐使用sizeof(s[0])这样的格式。
第四个参数,compare就是比较函数
首先compare一般定义为int compare(const void *a,const void *b)
升序 a>b return 1;a
int a[10] = { 10,9,8,7,6,5,4,3,2,1 };
int compare(const void *a, const void *b) {
int *p1, *p2;
p1 = (int *)a; p2 = (int *)b;
if (*p1 > *p2)
return 1;
else if (*p1 < *p2)
return -1;
else
return 0;
}
int main() {
qsort(a, 10, sizeof(a[0]),compare);
for (int i = 0; i < 10;i++) {
cout << a[i] << "--";
}
return 0;
}
我的理解,这里a和b实际上是指向数组里面元素的指针,,使用强制转换之后(int *),将地址赋值给p1和p2,而p1和p2就是地址。这里为什么要重新定义地址呢,是因为compare函数里面,a和b是void类型的。所以不能够直接使用。
- 对char类型数组排序
char a[10] = { 'b','d','c','f','e','g','i','h','z','k' };
int compare(const void *a, const void *b) {
char *p1, *p2;
p1 = (char *)a;
p2 = (char *)b;
if (*p1 > *p2)
return 1;
else if (*p1 < *p2)
return -1;
else
return 0;
}
int main() {
qsort(a, 10, sizeof(a[0]),compare);
for (int i = 0; i < 10;i++) {
cout << a[i] << "--";
}
return 0;
}
- 对double类型数组排序
double a[10] = { 9,8,7,6,5,4,3,2,1,10 };
int compare(const void *a, const void *b) {
double *p1, *p2;
p1 = (double*)a;
p2 = (double*)b;
if (*p1 > *p2)
return 1;
else if (*p1 < *p2)
return -1;
else
return 0;
}
int main() {
qsort(a, 10, sizeof(a[0]),compare);
for (int i = 0; i < 10;i++) {
cout << a[i] << "--";
}
return 0;
}
- 对结构体一级排序
class A{
private:
public:
double data1;
int data2;
void print() {
cout << data1 << "--" << data2 << endl;
}
};
int compare(const void *a, const void *b) {
A *p1, *p2;
p1 = (A*)a;
p2 = (A*)b;
if ((*p1).data1 > (*p2).data1)
return 1;
else if ((*p1).data1 < (*p2).data1)
return -1;
else
return 0;
}
int main() {
A a[10];
for (int i = 0; i < 10;i++) {
a[i].data1 = 10-i; a[i].data2 = i;
}
qsort(a, 10, sizeof(a[0]),compare);
for (int i = 0; i < 10;i++) {
a[i].print();
}
return 0;
}
- 对结构体二级排序
class A{
private:
public:
double data1;
int data2;
void print() {
cout << data1 << "--" << data2 << endl;
}
};
int compare(const void *a, const void *b) {
A *p1, *p2;
p1 = (A*)a;
p2 = (A*)b;
if ((*p1).data2 > (*p2).data2)
return 1;
else if ((*p1).data2 < (*p2).data2)
return -1;
else
return 0;
}
int main() {
A a[10];
for (int i = 0; i < 10;i++) {
a[i].data1 = 10-i; a[i].data2 = 10-i;
}
qsort(a, 10, sizeof(a[0]),compare);
for (int i = 0; i < 10;i++) {
a[i].print();
}
return 0;
}
- 第二种compare写法
int compare(const void *a, const void *b) {
A *p1, *p2;
p1 = (A*)a;
p2 = (A*)b;
if (p1->data2 > p2->data2)
return 1;
else if (p1->data2 < p2->data2)
return -1;
else
return 0;
}
- 第三种compare写法
int compare(const void *a, const void *b) {
A p1,p2;
p1 = (A*)a;
p2 = (A*)b;
if (p1.data2 > p2.data2)
return 1;
else if (p1.data2 < p2.data2)
return -1;
else
return 0;
}
因为,p1是一个对象,而在程序里面,a是一个指针,两者不是同一类型。
sort函数
class myclass{
private:
public:
int first; int second;
myclass(int a,int b):first(a),second(b){}
bool operator<(const myclass &m) {
return first < m.first;
}
void print() {
cout << first << "--" << second << endl;
}
};
bool less_second(const myclass & i1, const myclass & i2) {
return i1.second >i2.second;
}
struct yes {
bool operator()(myclass const & i1,myclass const & i2) {
return i1.second > i2.second;
}
};
int main() {
vector<myclass>data;
for (int i = 0; i < 10;i++) {
myclass my(10 - i, i * 3);
data.push_back(my);
}
cout << "original" << endl;
for (int i = 0; i < data.size();i++) {
data[i].print();
}
cout << "sorted by first" << endl;
sort(data.begin(), data.end());
for (int i = 0; i < data.size(); i++) {
data[i].print();
}
cout << "sorted by second" << endl;
sort(data.begin(), data.end(),less_second);
for (int i = 0; i < data.size(); i++) {
data[i].print();
}
sort(data.begin(), data.end(), yes());
for (int i = 0; i < data.size(); i++) {
data[i].print();
}
}
总结:
只需要在最后写一个bool cmp的比较函数即可。
这之前在leetcode已经做了很多,不再赘述
我记得在一道leetcode题目里面对一个函数做排序的时候是需要先写一个类的。待会儿把她找出来。
总结在qsort函数中a>b return 1的时候是升序
在sort函数中 return a>b 是降序