qsort函数
定义:快速排序任意类型数据库函数。
头文件:<stdlib.h>
qsort函数原型:
void qsort(void *base,size_t num,size_t width,int (*compare)(const void *,const void *))
各参数含义:
(1)base是待排序数组首元素地址;
(2)num是数组大小
(3)width是各元素占用空间大小;
(4)函数指针(回调函数)
回调函数:
定义:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
整形
#include<stdio.h>
#include<stdlib.h>
#define maxSize 5
int cmp(const void *a,const void *b)
{
int L=*((int*)a);
int R=*((int*)b);
if(L>R)
return 1;
else if(L==R)
return 0;
else
return -1;
//return *((int*)a) - *((int*)b);
}
int main()
{
int arr[maxSize]={5,6,9,4,1};
qsort(arr,maxSize,sizeof(arr[0]),cmp);
for(int i=0;i<maxSize;++i)
printf("%d ",arr[i]);
return 0;
}
double型
#include<stdio.h>
#include<stdlib.h>
#define maxSize 5
int cmp(const void *a,const void *b)
{
double L=*((double*)a);
double R=*((double*)b);
if(L>R)
return 1;
else if(L==R)
return 0;
else
return -1;
// return *(double *)a > *(double *)b ? 1 : -1;
}
int main()
{
double arr[maxSize]={5.1,2.1,3.1,4.1,1.1};
qsort(arr,maxSize,sizeof(arr[0]),cmp);
for(int i=0;i<maxSize;++i)
printf("%.2f ",arr[i]);
return 0;
}
字符型
#include<stdio.h>
#include<stdlib.h>
#define maxSize 5
int cmp(const void *a,const void *b)
{
char L=*((char*)a);
char R=*((char*)b);
if(L>R)
return 1;
else if(L==R)
return 0;
else
return -1;
// return *((char*)a) - *((char*)b);
}
int main()
{
char arr[]="bcdaf";
qsort(arr,maxSize,sizeof(arr[0]),cmp);
for(int i=0;i<maxSize;++i)
printf("%c ",arr[i]);
return 0;
}
字符串
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void *a,const void *b)
{
char *L=*((char**)a);
char *R=*((char**)b);
return strcmp(L, R);
}
int main()
{
char *words[10]=
{
"zz","gh","ef","cd","ab"
};
int n=5;
qsort(words,n,sizeof(char*),cmp);
for(int i=0;i<n;++i)
puts(words[i]);
return 0;
}
结构体数组
#include<stdio.h>
#include<stdlib.h>
typedef struct structTest
{
int a;
int b;
}structTest;
int cmp(const void *a,const void *b)
{
int L=((structTest*)a)->a;
int R=((structTest*)b)->a;
return L-R;
}
int main()
{
structTest structArray[5]=
{
{1,2},
{0,3},
{2,1},
{5,1},
{-1,0}
};
int n=5;
qsort(structArray,n,sizeof(structArray[0]),cmp);
for(int i=0;i<5;++i)
printf("%d,%d\n",structArray[i].a,structArray[i].b);
return 0;
}
结构数组的二级排序
#include<stdio.h>
#include<stdlib.h>
typedef struct structTest
{
int a;
int b;
}structTest;
int cmp(const void *a,const void *b)
{
int L=((structTest*)a)->a;
int R=((structTest*)b)->a;
if(L>R)
return 1;
else if(L==R)
{
int l=((structTest*)a)->b;
int r=((structTest*)b)->b;
return l-r;
}
else
return -1;
}
int main()
{
structTest structArray[5]=
{
{2,2},
{2,3},
{2,1},
{5,1},
{-1,0}
};
int n=5;
qsort(structArray,n,sizeof(structArray[0]),cmp);
for(int i=0;i<5;++i)
printf("%d,%d\n",structArray[i].a,structArray[i].b);
return 0;
}
如有错误,欢迎互相交流!