C语言自带的快速排序

使用qsort函数进行排序

函数名称:qsort,在头文件:

#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
    //这是从小到大排序,若是从大到小改成: return *(int *)b-*(int *)a;
}
int main()
{
    int a[100];
    int n;
    //n代表数组中有几个数字
    int i;
    for(i=1;i<=n;i++) scanf("%d",&a[i-1]);
    qsort(a,n,sizeof(a[0]),cmp);
    //(数组,需要排序的数字个数,单个数字所占内存大小,比较函数)
    for(i=1;i<=n;i++) printf("%d ",a[i-1]);
    return 0;
}
<think>我们参考用户提供的引用内容,用户需要了解在C语言中如何实现自定义排序函数。根据引用[1]和引用[2]的内容,我们可以提供两种方法:一种是完全自己编写排序函数(比如冒泡排序),另一种是利用C标准库中的qsort函数并自定义比较函数。 引用[1]中给出了两种方法: 1. 自己编写sort函数,例如使用冒泡排序算法对整型数组排序。 2. 使用C语言自带的qsort函数,需要自定义比较函数。 引用[2]则提到通过模仿qsort来实现自己的my_qsort函数,以加深对指针和排序算法的理解。 因此,我们可以从这两个方面来回答: 1. 手动实现排序函数(以冒泡排序为例)。 2. 使用标准库函数qsort并自定义比较函数。 3. 引用[3]中提到了结构体的自定义排序,我们可以扩展一下,说明如何对结构体等复杂类型进行排序。 由于用户明确要求用C语言实现自定义排序函数,我们将重点放在如何实现上,并给出示例代码。 注意:用户要求使用中文回答,并且代码部分需要用代码块标记。 步骤: 1. 首先介绍手动实现排序函数(冒泡排序为例)。 2. 然后介绍使用qsort函数,重点在于如何编写比较函数。 3. 最后介绍如何对结构体进行排序(使用qsort和自定义比较函数)。 注意:引用标识要添加在相应内容的末尾。 下面开始组织回答。 </think>### C语言实现自定义排序函数的方法 在C语言中实现自定义排序函数主要有两种方式:**手动实现排序算法**或**使用标准库qsort并自定义比较函数**。以下是具体实现方法: --- #### 1. **手动实现排序算法** 通过编写排序逻辑(如冒泡排序)实现自定义排序: ```c void custom_sort(int *arr, int size) { for (int i = 0; i < size - 1; i++) { for (int j = i + 1; j < size; j++) { if (arr[i] > arr[j]) { // 自定义排序规则(此处为升序) int temp = arr[i]; // 交换元素 arr[i] = arr[j]; arr[j] = temp; } } } } ``` **特点**: - 灵活控制排序规则(如修改`if`条件可实现降序)[^1]; - 适合学习排序算法原理,但效率较低($O(n^2)$复杂度)。 --- #### 2. **使用标准库qsort + 自定义比较函数** C标准库提供`qsort()`函数,需配合自定义比较函数: ```c #include <stdlib.h> // 比较函数(升序规则) int compare(const void *a, const void *b) { return (*(int*)a - *(int*)b); } int main() { int arr[] = {5, 2, 8, 1, 3}; int size = sizeof(arr) / sizeof(arr[0]); qsort(arr, size, sizeof(int), compare); // 调用qsort // 输出排序结果... return 0; } ``` **特点**: - 高效($O(n \log n)$复杂度,基于快速排序)[^1]; - 通用性强:通过修改`compare`函数可支持任意数据类型排序。 --- #### 3. **复杂数据类型排序示例(结构体)** 对结构体数组按指定字段排序: ```c #include <stdlib.h> typedef struct { int id; char name[20]; } Student; // 按id升序排列 int compare_by_id(const void *a, const void *b) { return ((Student*)a)->id - ((Student*)b)->id; } int main() { Student list[3] = {{3, "Alice"}, {1, "Bob"}, {2, "Cathy"}}; qsort(list, 3, sizeof(Student), compare_by_id); // 按id排序 // 输出排序结果... return 0; } ``` **关键点**: - 比较函数需将`void*`指针转换为实际类型后访问字段[^3]; - 支持多级排序(如先按id,再按name)。 --- ### 方法对比 | **方法** | **优点** | **缺点** | |------------------------|-----------------------------|------------------------| | 手动实现排序算法 | 逻辑透明,易于定制规则 | 效率低,需重复造轮子 | | `qsort` + 比较函数 | 高效,支持任意数据类型 | 需理解指针和内存布局 | > 📌 **建议**:优先使用`qsort`,兼顾效率与扩展性;若需特殊排序逻辑(如非连续内存排序),可手动实现。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nine_mink

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值