C语言中排序函数的用法

C语言排序详解
本文详细介绍了C语言中自定义sort函数的方法及标准库函数qsort的使用,包括不同数据类型的排序示例,如int、char、double及结构体等。
C语言中没有预置的sort函数。如果在C语言中,遇到有调用sort函数,就是自定义的一个函数,功能一般用于排序。
一、可以编写自己的sort函数。
如下函数为将整型数组从小到大排序。
void sort(int *a, int l)//a为数组地址,l为数组长度。
{
    int i, j;
    int v;
    //排序主体
    for(i = 0; i < l - 1; i ++)
        for(j = i+1; j < l; j ++)
        {
            if(a[i] > a[j])//如前面的比后面的大,则交换。
            {
                v = a[i];
                a[i] = a[j];
                a[j] = v;
            }
        }
}
对于这样的自定义sort函数,可以按照定义的规范来调用。

二、C语言有自有的qsort函数。
功 能: 使用快速排序例程进行排序
头文件:stdlib.h
原型: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
参数:
1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序
这个函数必须要自己写比较函数,即使要排序的元素是int,float一类的C语言基础类型。
以下是qsort的一个例子:
#include<stdio.h>
#include<stdlib.h>
int comp(const void*a,const void*b)//用来做比较的函数。
{
    return *(int*)a-*(int*)b;
}
int main()
{
    int a[10] = {2,4,1,5,5,3,7,4,1,5};//乱序的数组。
    int i;
    qsort(a,n,sizeof(int),comp);//调用qsort排序
    for(i=0;i<10;i++)//输出排序后的数组
    {
        printf("%d\t",array[i]);
    }
    return 0;
}


---- - - - -  -  -   -    -    - 分割线   ——————————————————————————————————

在c++中qsort()排序函数的使用qsort函数应用大全 
七种qsort排序方法  
<本文中排序都是采用的从小到大排序>  
一、对int类型数组排序  
int num[100];  
Sample:  
int cmp ( const void *a , const void *b )  
{  
return *(int *)a - *(int *)b;  
}  
qsort(num,100,sizeof(num[0]),cmp);  
二、对char类型数组排序(同int类型)  
char word[100];  
Sample:  
int cmp( const void *a , const void *b )  
{  
return *(char *)a - *(int *)b;  
}  
qsort(word,100,sizeof(word[0]),cmp);  
三、对double类型数组排序(特别要注意)  
double in[100];  
int cmp( const void *a , const void *b )  
{  
return *(double *)a > *(double *)b ? 1 : -1;  
}  
qsort(in,100,sizeof(in[0]),cmp);  
四、对结构体一级排序  
struct In  
{  
double data;  
int other;  
}s[100]  
//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写  
int cmp( const void *a ,const void *B)  
{  
return (*(In *)a)->data > (*(In *)B)->data ? 1 : -1;  
}  
qsort(s,100,sizeof(s[0]),cmp);  
五、对结构体二级排序  
struct In  
{  
int x;  
int y;  
}s[100];  
//按照x从小到大排序,当x相等时按照y从大到小排序  
int cmp( const void *a , const void *b )  
{  
struct In *c = (In *)a;  
struct In *d = (In *)b;  
if(c->x != d->x) return c->x - d->x;  
else return d->y - c->y;  
}  
qsort(s,100,sizeof(s[0]),cmp);  
六、对字符串进行排序  
struct In  
{  
int data;  
char str[100];  
}s[100];  
//按照结构体中字符串str的字典顺序排序  
int cmp ( const void *a , const void *b )  
{  
return strcmp( (*(In *)a)->str , (*(In *)B)->str );  
}  
qsort(s,100,sizeof(s[0]),cmp);  
七、计算几何中求凸包的cmp  
int cmp(const void *a,const void *B) //重点cmp函数,把除了1点外的所有点,旋转角度排序  
{  
struct point *c=(point *)a;  
struct point *d=(point *)b;  
if( calc(*c,*d,p[1]) < 0) return 1;  
else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //如果在一条直线上,则把远的放在前面  
return 1;  
else return -1;  
}  
:  
c++中加载头文件 "iostream" 
c中qsort函数包含在<stdlib.h>的头文件里,strcmp包含在<string.h>的头文件里


<think>好的,我需要帮用户找到C语言中实现降序排序函数及其用法示例。用户提到了想了解函数的具体实现和用法,所以首先应该考虑标准库中的qsort函数,因为这是C语言里常用的排序函数,用户之前的引用中也提到了qsort的相关内容。 首先,回忆一下qsort函数用法。qsort需要四个参数:数组指针、元素个数、元素大小和比较函数。比较函数决定了排序的顺序,所以要实现降序排序,关键在于编写适当的比较函数。 接下来,比较函数的写法。标准做法是将void指针转换为具体类型的指针,然后比较两个元素的值。对于升序,通常是返回a - b,而降序则需要返回b - a。比如,在用户提供的引用[2]中,示例使用的是升序,返回tempA - tempB,那么降序的话应该是tempB - tempA。 然后,考虑用户可能需要一个自定义的排序函数,比如引用[4]提到的sortDescending函数,但那个函数可能不是用qsort实现的。这时候需要明确用户是想用标准库的qsort来实现降序,还是自己写一个排序函数,比如冒泡排序来实现降序。根据用户的引用[3]和[4],可能两种方法都需要说明。 用户引用了[5],其中提到输入排序标识来选择升序或降序,这说明可能需要一个通用的比较函数,根据标识来调整比较逻辑。不过用户的问题更偏向于如何实现降序的函数,所以重点放在比较函数上。 接下来需要给出具体的示例代码。比如,使用qsort实现降序排序的比较函数,然后在主函数中调用。同时,可能需要提到如何用自定义函数比如冒泡排序来实现降序,但用户的问题可能更关注标准库的方法,所以先以qsort为主。 另外,用户提供的引用[1]中提到了自定义排序函数my_qsort,模仿qsort的实现,但使用的是冒泡排序。这可能也是一个相关点,可以提到如果需要自己实现排序函数,可以参考这种方式,但标准做法是使用qsort。 总结步骤:1. 解释qsort函数的基本用法;2. 提供降序比较函数的写法;3. 给出完整的代码示例;4. 可能提到其他方法,如自定义函数的实现,但主要回答应集中在qsort上。 检查是否有遗漏,比如是否需要处理不同的数据类型,但用户的问题是关于整型数组的,所以示例中使用int类型即可。同时,确保代码正确,比如指针转换和比较函数的返回值的处理是否正确。例如,在比较函数中,如果a小于b,降序排序应该返回负数,这样qsort会交换它们的位置,所以正确的做法是用b - a,这样当a < b时返回正数,让qsort认为a应该排在后面,从而实现降序。 最后,生成相关问题时要围绕降序排序的实现、比较函数的作用、qsort的其他应用等,确保问题相关且有助于用户进一步学习。</think>### C语言实现降序排序函数用法示例 在C语言中,可以通过自定义比较函数结合标准库函数 `qsort` 实现降序排序。以下是具体实现方法和示例: --- #### 1. 使用 `qsort` 实现降序排序 `qsort` 是C语言标准库中的快速排序函数,其核心是通过自定义比较函数控制排序顺序。 **函数原型**: ```c void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); ``` **降序比较函数**: 比较函数需返回以下值: - **正数**:若第一个元素应排在第二个元素之后(降序) - **负数**:若第一个元素应排在第二个元素之前 - **0**:若两元素相等 ```c int compare_desc(const void *a, const void *b) { int numA = *(int*)a; // 将 void 指针转换为 int 指针并取值 int numB = *(int*)b; return numB - numA; // 降序逻辑:若 numB > numA,返回正数 } ``` **完整示例**: ```c #include <stdio.h> #include <stdlib.h> int compare_desc(const void *a, const void *b) { return *(int*)b - *(int*)a; } int main() { int arr[] = {5, 2, 8, 1, 6}; int n = sizeof(arr) / sizeof(arr[0]); qsort(arr, n, sizeof(int), compare_desc); printf("降序结果:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); // 输出:8 6 5 2 1 } return 0; } ``` --- #### 2. 自定义降序排序函数(如冒泡排序) 若需手动实现降序逻辑,可基于冒泡排序算法[^3]: ```c void sortDescending(int arr[], int n) { for (int i = 0; i < n-1; i++) { for (int j = 0; j < n-i-1; j++) { if (arr[j] < arr[j+1]) { // 比较相邻元素,决定是否交换 int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } ``` --- #### 3. 根据标识动态选择升序/降序 结合输入参数控制排序方向[^5]: ```c int compare(const void *a, const void *b, int order) { int numA = *(int*)a; int numB = *(int*)b; return (order == 0) ? (numA - numB) : (numB - numA); } ``` --- ### 关键点总结 1. **`qsort` 的灵活性**:通过调整比较函数,可轻松切换升序/降序[^2]。 2. **性能差异**:`qsort` 基于快速排序,时间复杂度为 $O(n \log n)$;冒泡排序为 $O(n^2)$,适合小规模数据[^1][^3]。 3. **通用性**:比较函数需处理 `void*` 类型指针,适配不同数据类型。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值