目录
#include<stdlib.h>
int main()
{
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void
*elem1, const void *elem2 ) );
return 0;
}
定义:执行快速排序
头文件:<stdlib.h>
注释:qsort函数实现了一个快速排序算法,对一个包含num个元素的数组进行排序,每个元素的宽度/字节。实参base是指向要排序的数组起始位置的指针。Qsort用已排序的元素覆盖此数组。参数compare是指向用户提供的例程的指针,用于比较两个数组元素并返回指定它们之间关系的值。Qsort在排序过程中调用一次或多次比较例程,每次调用传递指向两个数组元素的指针:
注:这里之所以要自定义比较的函数,是因为使用者在进行数据比较的时候,比较的类型包括但不限于整型,浮点型,甚至是结构体类型的数据,使用者可以根据自己的需要,设计出具体比较不同类型的函数。
2.1 qsort排序整数类型
#include<stdlib.h>
void print(int arr[], int sz)//打印数组
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int __cdelc(const void* e1, const void* e2)//自定义比较函数
{
if (*(int*)e1 , *(int*)e2)
{
return (*(int*)e1 - *(int*)e2);
}
}
void test1() //qsort函数排序整型数组
{
int arr[] = { 1,3,5,7,9,2,4,6,8,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), __cdelc);
print(arr, sz);
}
int main()
{
test1();
return 0;
}
2.2 qsort排序结构体类型
#include<stdio.h>
#include<stdlib.h>
struct stu//定义结构体类型
{
char name[10];
int age;
double score;
};
void print2(struct stu arr[], int sz)//打印
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%s, %d, %lf\n", arr[i].name, arr[i].age, arr[i].score);
}
}
int __cdelc2_by_age(const void* e1, const void* e2)//通过年龄比较
{
return (((struct stu*)e1)->age - ((struct stu*)e2)->age);
}
int __cdelc2_by_name(const void* e1, const void* e2)//通过名字比较
{
return strcpy( ((struct stu*)e1)->name, ((struct stu*)e2)->name );
}
test2()
{
struct stu arr[] = {
{"小明",15,65.5},{"小强",19,80.5},{"小美",17,70.0}};
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), __cdelc2_by_age);
//qsort(arr, sz, sizeof(arr[0]), __cdelc2_by_name);
print2(arr, sz);
}
int main()
{
test2();
return 0;
}
代码如下:
#include<stdio.h>
void print3(int arr[], int sz)//打印
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
void swap(char* buf1, char* buf2, int width) //交换函数
{
int i = 0;
for (i = 0; i < width; i++)
{
char* tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void bubble_qsort(void* base, int num, int width, int(*cmp)(const void* e1, const void* e2))
{
int i = 0;
int j = 0;
for (i = 0; i < num - 1; i++)
{
for (j = 0; j < num - 1 - i; j++)
{
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0) //比较
{
swap((char*)base + j * width, (char*)base + (j + 1) * width, width);//交换
}
}
}
}
int __cdelc3(const void* e1, const void* e2)//比较函数
{
return (*(int*)e1 - *(int*)e2);
}
void test3()
{
int arr[] = { 1,3,5,7,9,2,4,6,8,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_qsort(arr, sz, sizeof(arr[0]), __cdelc3);
print3(arr, sz);
}
int main()
{
test3();
return 0;
}
思路:
比较元素的思路:
交换元素的思路:
以上仅供参考,欢迎指正