目录
回调函数
标准库中<stdlib.h>qsort函数声明:
void _Cdecl qsort (void *base, size_t nelem, size_t width, int _Cdecl (*fcmp)(/* const void *, const void * */));
int 数组排序:
/*快速排序*/
void qsort(int v[], int left, int right)
{
int i, last;
void swap(int v[], int i, int j);
if(left >= right)
return;
swap(v, left, (left + right)/2);
last = left;
for(i = left + 1; i <= right; i++)
{
if(v[i] < v[left])
{
swap(v, ++last, i);
}
}
swap(v, left, last);
qsort(v, left, last - 1);
qsort(v, last + 1, right);
}
/*交换v[i], v[j]的值*/
void swap(int v[], int i, int j)
{
int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
用函数指针实现qsort
更改后的qsort函数可以处理任意类型的数据类型。该函数是函数指针的经典应用。
void qsort(void* v[], int left, int right, int (*comp)(void *, void *));
int f(int a, int b);
int main()
{
int i;
int a[10] = {1, 2, 45, -4, 322, 21, 23, 45, 8, 0};
qsort((void **)a, 0, sizeof(a)/sizeof(int) - 1,(int(*)(void *, void *))f);
for(i = 0; i < sizeof(a)/sizeof(int); i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
int f(int a, int b)
{
if(a == b)
return 0;
if(a < b)
return -1;
if(a > b)
return 1;
}
/*快速排序*/
void qsort(void * v[], int left, int right, int (*comp)(void *, void *))
{
int i, last;
void swap(void *v[], int i, int j);
if(left >= right)
return;
swap(v, left, (left + right)/2);
last = left;
for(i = left + 1; i <= right; i++)
{
if((*comp)(v[i], v[left]) < 0)
{
swap(v, ++last, i);
}
}
swap(v, left, last);
qsort(v, left, last - 1, comp);
qsort(v, last + 1, right, comp);
}
/*交换v[i], v[j]的值*/
void swap(void *v[], int i, int j)
{
void * temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}