对qsort的理解
c语言中自带的快拍qsort, 需要自己写一个comp的比较函数.
void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
(数组名, 长度, 比较函数)
# include <stdio.h>
# include <stdlib.h>
int a[] = {1, 3, 4, 2, 5};
//从小到大
int comp(const void * p1, const void * p2){
return *((int*)p1) - *((int *)p2);
}
int main(){
qsort(a, 5, sizeof(int), comp);
for(int i = 0; i < 5; ++i){
printf("%d\t", a[i]);
}
return 0;
}
因此做出测试, 以便理解qsort的原理
在comp中加入一下代码输出测试结果.
puts("\n");
for(int i = 0; i<5; ++i){
printf("%d\t", a[i]);
}
puts("\n\n");
printf("%d -- %d = %d\n", *((int*)p1), *((int *)p2), *((int*)p1) - *((int *)p2));
第一次测试
有结果可知, p2, p1的顺序, p2是前面那个数, p1是后面那个数.
如果返回正数, 则证明后面的比前面的大, 这个大的书进入下次的比较, 3 --> 4
返回负数, 则证明前面的数大, 该数继续进行下次的比较,
5–4 = 1// 第一轮结束, 最大值为5
第二轮, 从头开始判断, 找到一个最大值, 放在倒数第二个位置.
类似于冒泡排序.
简单说, 返回负数, 则将p1要放在后面, (p1在p2的后面)
return ((int)p1) - *((int *)p2);
即为从小到大排序.
return ((int)p2) - *((int *)p1);
即为从小到打排序
若将数组a改为
int a[] = {5, 3, 4, 2, 1};
可以自己理解下.
之后将写
int arr1[];
float arr2[];
char arr3[];
char arr4[][]; //每个字符串进行排序
int arr5[][];//每行的数据进行排序