快排函数是qsort(); 头文件是
快排函数有4个参数, 分别是要 数组的索引,数组的长度, 数组的一个单位的字节数 和 比较函数。
直接上例子了!
#include
#include
int comp(const void *a,const void *b){
return *(int *)a - *(int *)b;
}
int main() {
int s[100], i, n;
while(~scanf("%d",&n)) {
for(i = 0; i < n; i++)
scanf("%d", &s[i]);
qsort(s, n, sizeof(s[0]), comp);
for(i = 0; i < n; i++)
printf("%d ", s[i]);
printf("\n");
}
}
上面的是 int 数组 递增排序。 期中comp() 就是比较函数, a 比 b 大就要返回正数, 等于返回0 否则返回负数。
comp() 也可以这样写 return *(int *) a > *(int *) b ? 1 : -1; 表示 a 大于 b 就返回正数, a小于等于b 就返回负数(方正两个数一样,交换顺序也一样)
如果要 递减排序 就改改比较函数就可以了。
int comp(const void *a,const void *b){
return *(int *)b - *(int *)a;
}
在上个double数组的快排例子。
#include
#include
int cmp(const void * a, const void * b) {
return *(double*)a - *(double*)b;
}
int main() {
double s[1000];
int i, n;
while(~scanf("%d", &n)) {
for(i = 0; i < n; i++)
scanf("%lf", &s[i]);
qsort(s, n, sizeof(s[0]), cmp);
for(i = 0;i < n; i++)
printf("%lf\n", s[i]);
printf("\n");
}
}
double的也是一样的。 就是强制为 (double *) 就好了。 原理一样。
在上个字符串快排
#include
#include
#include
int cmp(const void *a, const void *b) {
return strcmp((char *)a, (char *)b);
}
int main() {
char c[1000][100];
int i, n;
while(~scanf("%d", &n)) {
for(i = 0; i < n; i++)
scanf("%s", c[i]);
qsort(c, n, sizeof(c[0]), cmp);
for(i = 0; i < n; i++)
printf("%s\n", c[i]);
}
}
上面的代码是 字符串 递增快排。 返回的就用 strcmp() 原理也是一样, 小就返回负数, 等于就0, 大就返回正数
如果想递减的 那就 returned -strcmp(……);
最后上个结构体的。
#include
#include
typedef struct {
int a;
int num;
char str[100];
} list;
list s[1000];
int cmp(const void *a, const void *b) {
return (*(list *)a).num - (*(list *)b).num;
}
int main() {
int i, n;
while(~scanf("%d", &n)) {
for(i = 0; i < n; i++)
scanf("%d%d %s", &s[i].a, &s[i].num, &s[i].str);
qsort(s, n, sizeof(s[0]), cmp);
for(i = 0; i < n; i++)
printf("%d %d %s\n", s[i].a, s[i].num, s[i].str);
}
}
上面的是 一结构体内的 num成员 递增快排,
如果想按字符串递减快排也可以换成
#include
int cmp(const void *a, const void *b) {
return -strcmp((*(list *)a).str, (*(list *)b).str);
}
原理就只有一个,就是操作返回值
两个形参,分别是a, b;
qsort() 会看返回值;
如果 a - b 与 你设置的返回值 同号, 就是递增, 例 return *(int *) a - *(int *) b; 和 return strcmp((char *) a, (char *) b); 都是 a - b 与 设置的返回值 的同号的。
如果 a - b 与 你设置的返回值 异号, 就是递减, 例 return *(int *)b - *(int *) a; 和 return -strcmp((char *) a, (char *) b);
希望对大家有用。