1 写在前面:
com - sort 返回 false / true,用 < 或 >
cmp - qsort 返回数字,用 - (减号)
两个函数 真正 控制 升降序
int com(int a, int b)
{
return a cmp1 b;
}
int cmp(const void *a, const void *b)
{
return cmp1(*(int *)a - *(int *)b);
}
com - cmp1控制升降序: <升序, >降序
cmp a-b 升序,b-a 降序
com函数 和 cmp函数 的函数列表形式对于 一维数组 不可改动!
对于不同数据类型的数组,改动函数内部的数据类型即可
com函数 的函数列表形式 对于结构体 要改动!
cmp函数 的函数列表形式 对于结构体 仍不能改动!
2 sort()
2.1 一维数组排序
sort(数组名, 数组名 + 长度, com)
com 控制 升序 和 降序
可不写com,这时 默认升序
sort(a.data, a.data + a.length, com);
可以试试:
sort(a.data, a.data + a.length - 1, com); // [0, a.length - 1]排序
sort(a.data, a.data + a.length + 1, com); // [0, a.length + 1]排序
cmp1控制升降序: <升序, >降序
#include<bits/stdc++.h>
#define num 100
#define cmp1 < // cmp1控制升降序: <升序, >降序
using namespace std;
typedef struct
{
int data[num];
int length;
}sqlist;
void init(sqlist &a)
{
a.length = 0;
cout << "初始化完成!" << endl << endl;
}
void creat(sqlist &a)
{
int length = rand()%num;
cout << "length = " << length << endl;
int i;
for(i = 0; i < length; i++)
{
a.data[i]= rand()%num;
}
a.length = length;
cout << "创建完成" << endl << endl;
}
void print(sqlist a)
{
int length = a.length;
int i;
cout << "输出:" << endl;
if(length != 0)
{
for(i = 0; i < length; i++)
{
printf("%-3d", a.data[i]);
if((i + 1)%20 == 0)
cout << endl;
}
cout << endl << endl;
}
else
cout << "为空!" << endl << endl;
}
int com(int a, int b)
{
return a cmp1 b;
}
int main()
{
sqlist a;
srand(time(NULL));
init(a);
print(a);
creat(a);
print(a);
cout << "sort()" << endl;
sort(a.data, a.data + a.length, com);
cout << "完成!" << endl << endl;
print(a);
system("pause");
return 0;
}
2.2 结构体二级排序
sort(a, a + length, com);
cmp1控制升降序: <升序, >降序
#include<bits/stdc++.h>
#define num 100
#define cmp1 < // cmp1控制升降序: <升序, >降序
using namespace std;
int length;
typedef struct
{
int x; // 原位置
int y; // 元素值
}sqlist;
void init(sqlist a[])
{
memset(a, 0, sizeof(a));
cout << "初始化完成!" << endl << endl;
}
void creat(sqlist a[])
{
length = rand()%num;
cout << "length = " << length << endl;
int i;
for(i = 0; i < length; i++)
{
a[i].x = i + 1;
a[i].y = rand()%num;
}
cout << "创建完成" << endl << endl;
}
void print(sqlist a[])
{
int i;
cout << "输出:" << endl;
if(length != 0)
{
for(i = 0; i < length; i++)
{
printf("%-3d %-3d\n", a[i].x, a[i].y);
if((i + 1)%20 == 0)
cout << endl;
}
cout << endl << endl;
}
else
cout << "为空!" << endl << endl;
}
int com(sqlist a, sqlist b)
{
return a.y cmp1 b.y;
}
int main()
{
sqlist a[num];
srand(time(NULL));
init(a);
print(a);
creat(a);
print(a);
cout << "sort()" << endl;
sort(a, a + length, com);
cout << "完成!" << endl << endl;
print(a);
system("pause");
return 0;
}
2.3 结构体二级排序升级
对于结构体:
typedef struct
{
int x; // 原位置
int y; // 元素值
}sqlist;
y部分升序,y相同则x部分降序
仅将上面带的com部分修改即可
cmp1控制y部分升降序, <升序, >降序
cmp2控制x部分升降序, <升序, >降序
int com(sqlist a, sqlist b)
{
if(a.y == b.y)
return a.x cmp2 b.x;
else
return a.y cmp1 b.y;
}
3 qsort()
3.1 一维数组排序
qsort(数组名, 排序的长度, 各元素空间大小, cmp)
cmp不可省略!
cmp 控制 正序 和 倒序
cmp1 更方便控制控制 正序 和 倒序(黑盒)
cmp a-b 升序,b-a 降序
qsort(a.data, a.length, sizeof(a.data[0]), cmp) ;
可以试试:
qsort(a.data, a.length - 1, sizeof(a.data[0]), cmp) ; // [0, a.length - 1]部分排序
qsort(a.data, a.length + 1, sizeof(a.data[0]), cmp) ; // [0, a.length + 1]部分排序
#include<bits/stdc++.h>
#define num 100
#define cmp1 + // cmp1控制升降序, +升序, -降序
using namespace std;
typedef struct
{
int data[num];
int length;
}sqlist;
void init(sqlist &a)
{
a.length = 0;
cout << "初始化完成!" << endl << endl;
}
void creat(sqlist &a)
{
int length = rand()%num;
cout << "length = " << length << endl;
int i;
for(i = 0; i < length; i++)
{
a.data[i]= rand()%num;
}
a.length = length;
cout << "创建完成" << endl << endl;
}
void print(sqlist a)
{
int length = a.length;
int i;
cout << "输出:" << endl;
if(length != 0)
{
for(i = 0; i < length; i++)
{
printf("%-3d", a.data[i]);
if((i + 1)%20 == 0)
cout << endl;
}
cout << endl << endl;
}
else
cout << "为空!" << endl << endl;
}
int cmp(const void *a, const void *b)
{
return cmp1(*(int *)a - *(int *)b);
}
int main()
{
sqlist a;
srand(time(NULL));
init(a);
print(a);
creat(a);
print(a);
cout << "qsort()" << endl;
qsort(a.data, a.length, sizeof(a.data[0]), cmp) ;
cout << "完成!" << endl << endl;
print(a);
system("pause");
return 0;
}
3.2 结构体二级排序
qsort(a, length, sizeof(a[0]), cmp);
其中sizeof(a[0]) 不是 sizeof(a) !
#include<bits/stdc++.h>
#define num 100
#define cmp1 + //cmp1控制升降序, +升序, -降序
using namespace std;
int length;
typedef struct
{
int x; // 原位置
int y; // 元素值
}sqlist;
void init(sqlist a[])
{
memset(a, 0, sizeof(a));
cout << "初始化完成!" << endl << endl;
}
void creat(sqlist a[])
{
length = rand()%num;
cout << "length = " << length << endl;
int i;
for(i = 0; i < length; i++)
{
a[i].x = i + 1;
a[i].y = rand()%num;
}
cout << "创建完成" << endl << endl;
}
void print(sqlist a[])
{
int i;
cout << "输出:" << endl;
if(length != 0)
{
for(i = 0; i < length; i++)
{
printf("%-3d %-3d\n", a[i].x, a[i].y);
if((i + 1)%20 == 0)
cout << endl;
}
cout << endl << endl;
}
else
cout << "为空!" << endl << endl;
}
int cmp(const void *a, const void *b)
{
sqlist *c = (sqlist *)a;
sqlist *d = (sqlist *)b;
return cmp1(c->y - d->y);
}
int main()
{
sqlist a[num];
srand(time(NULL));
init(a);
print(a);
creat(a);
print(a);
cout << "qsort()" << endl;
qsort(a, length, sizeof(a[0]), cmp);
cout << "完成!" << endl << endl;
print(a);
system("pause");
return 0;
}
.
3.3 结构体二级排序升级
对于结构体:
typedef struct
{
int x; // 原位置
int y; // 元素值
}sqlist;
y部分升序,y相同则x降序
cmp1控制y部分升降序, +升序, -降序
cmp2控制x部分升降序, -升序, +升序
int cmp(const void *a, const void *b)
{
sqlist *c = (sqlist *)a;
sqlist *d = (sqlist *)b;
if(c->y != d->y)
return cmp2(c->y - d->y);
else
return cmp1(d->x - c->x);
}