C语言中有一个快速排序的标准库函数 qsort ,在stdlib.h 中声明。
定义如下:
void qsort(void *base, int nelem, unsigned int width, int ( * pfCompare)( const void *, const void *));
参数解读:
“比较函数”的原型是:int 函数名(const void * elem1, const void * elem2);该函数的两个参数,elem1 和elem2,指向待比较的两个元素。也就是说, * elem1 和* elem2 就是待比较的两个元素。
比较方法如下:
qsort系统调用实现
#include
int int_cmp(const void *p1, const void *p2)
{
return (*(int *)p1 - *(int *)p2);
}
int main()
{
int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
int i = 0;
qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
for (i = 0; i
qsort自己实现
#include
#include
#include //断言
#include //pause
//比较函数
int CompInt(const void *_xp, const void *_yp)
{
int *xp = (int*)_xp;
int *yp = (int*)_yp;
if (*xp > *yp){
return 1;
}
else if (*xp < *yp){
return -1;
}
else{
return 0;
}
}
//打印函数
void Print(int *arr, int num)
{
for (int i = 0; i < num; i++){
printf("%d ", arr[i]);
}
printf("\n");
}
//字符串比较函数
int CompStr(const void *_xp, const void *_yp)
{
char *s1 = *(char**)_xp;
char *s2 = *(char**)_yp;
return strcmp(s1, s2); // 1 0 -1
}
//交换
void swap(char *src, char *dst, int size)
{
while (size){
char temp = *src;
*src = *dst;
*dst = temp;
size--;
src++, dst++;
}
}
//快速排序
void my_qsort(void *arr, int num, int size, int(*comp)(const void*, const void*))
{
assert(arr != NULL);
assert(comp != NULL);
char *e = (char*)arr;
for (int i = 0; i < num - 1; i++){
int flag = 0;
for (int j = 0; j < num - 1 - i; j++){
if (comp(e + j*size, e + (j + 1)*size) > 0){
flag = 1;
swap(e + j*size, e + (j + 1)*size, size);
}
}
if (flag == 0){
break;
}
}
}
int main()
{
int arr1[] = { 24, 345, 13, 45, 5, 23, 35, 856, 234, 21, 3, 45, 34, 234, 1, 4, 6 };
int num1 = sizeof(arr1) / sizeof(arr1[0]);
Print(arr1, num1);
my_qsort(arr1, num1, sizeof(int), CompInt);
Print(arr1, num1);
char *arr2[] = { "b1234", "a1234", "4321", "abcdef" };
int num2 = sizeof(arr2) / sizeof(arr2[0]);
Print_Str(arr2, num2);
my_qsort(arr2, num2, sizeof(int), CompStr);
Print_Str(arr2, num2);
system("pause");
return 0;
}