C语言中qsort的使用方法
利用qsort进行冒泡排序
qsort函数原型:
void qsort(void *base,size_t nmemb,size_t size,int (*compar)(const void *,const void *));//base 要排序的数组;nmemb 数组长度;size 数组元素长度;以怎样的方式进行排列
void mysort(int* base,size_t nmemb,int (*com)(int,int)){//自己写出qsort函数
int i,j;
int swapflag = 0;
for(i=0;i<nmemb-1;i++){//进行nmemb次冒泡
swapflag = 0;
for(j=1;j<nmemb-i;j++){
//if(base[j]<base[j-1]){//base[j]-base[j-1] < 0
//if(base[j]-base[j-1]<0){
if(com(base[j],base[j-1])<0){//base[j-1]-base[j]<0
swap(base+j,base+j-1);
swapflag = 1;
}
}
if(swapflag == 0){
break;
}
}
}
qsort调用:
#include<stdio.h>
#include<stdlib.h>
int comparInt(const void *pd1,const void *pd2){
const int *pi1 = (const int *)pd1;//对pd1进行强转,转成int*类型
const int *pi2 = (const int *)pd2;
return *pi1 - *pi2;//如果*pi1 - *pi2结果为正,就把*pi1和*pi2进行互换,小的数排到前面,升序排列
}
int main(){
int arr[] = {2,6,1,4,9,7,3,5,0,8};
qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),comparInt);//sizeof(int)也可以写sizeof(arr[0])
int i;
for(i=0;i<sizeof(arr)/sizeof(arr[0];i++){
printf("%d ",arr[i]);
}
puts("");
return 0;
}
编译结果为
用qsort对结构体数组进行排序:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Stu{
int no;
char name[40];
int score[3];
}Stu;
int comparNo(const void *pd1,const void *pd2){
const Stu *pi1 = (const Stu *)pd1;
const Stu *pi2 = (const Stu *)pd2;
return pi1->no - pi2->no;
}
int comparScore(const void *pd1,const void *pd2){
const Stu *pi1 = (const Stu *)pd1;//使用typedef进行了结构体重命名
const Stu *pi2 = (const Stu *)pd2;
int s1 = pi1->score[0]+pi1->score[1]+pi1->score[2];
int s2 = pi2->score[0]+pi2->score[1]+pi2->score[2];
return s1 - s2;
}
int main(){
Stu stus[] = {
{104,"卢本伟",{100,100,100}},
{103,"韩金龙",{95,95,95}},
{101,"胡凯利",{59,59,59}},
{105,"凯菇",{90,90,90}},
{102,"余江川",{70,70,70}}
};
qsort(stus,sizeof(stus)/sizeof(stus[0]),sizeof(stus[0],comparNo);
showStu(stus,sizeof(stus)/sizeof(stus[0]);
qsort(stus,sizeof(stud)/sizeof(stus[0]),sizeof(stus[0],comparScore);
showStu(stus,sizeof(stus)/sizeof(stus[0]);
return 0;
}
结果图: