Bootstrap

(C语言)对所输入的任意数目的数进行降序排序(指针解法)

#include <stdio.h>
#include <stdlib.h> //动态内存管理函数要用的头文件

//定义一个降序排序数组的函数
void max(int *arr,int size){
    int t=0;//交换容器,初始值为0
    for (int i=0;i<size-1;i++){
        for (int j=i+1;j<size;j++){
            if (arr[i]<arr[j]){
                t=arr[i];
                arr[i]=arr[j];
                arr[j]=t;
            }
        }
    }
}

int main(){
    int count=0;
    int *numbers=NULL; //int型指针数组,初始为NULL
    printf("请确定要排序的数的总数:\n");
    //检查scanf输入的是否合法(是不是为数字)
    if (scanf("%d",&count)!=1)
    {
        printf("输入的不是有效数字!");
        return 1;
    }
    numbers=(int*)malloc(count*sizeof(int)); //给数组申请内存空间
    if (numbers==NULL)
    {
        printf("内存申请失败\n");
        return 1; //分配失败返回值为1;
    }
    printf("请输入你要排序的%d个数字:\n",count);
    for (int i = 0; i < count; i++)
    {
        //每写一个数,就放进数组中
        //同样检查scanf是否合法
        if (scanf("%d",&numbers[i])!=1){
            printf("输入的不是有效数字!");
            free(numbers);  // 释放已分配内存
            return 1;
        }
    }
    max(numbers,count);
    printf("排序后的顺序为:\n");
    //遍历排序后的数组
    for(int i=0;i<count;i++){
        printf("%d\t",numbers[i]);
    }
    //释放内存空间
    free(numbers);
    numbers=NULL;

    return 0;
}

在上一篇中,我们实现了三个数的降序排序,那如果要排序很多数呢,需要一个一个加吗?那样工作量太大了,因此我们想一个新的思路,内存空间的动态分配。

使用头文件#include <stdlib.h>,借此来使用动态分配函数malloc,实现数组的动态写入。

这里需要稍微的计算需要申请的空间,首先进行类型转换(int *)来保证指针为整数类型,count是用户所需要排序的数,count * sizeof(int)就是需要的空间(int的字节是4),然后检查内存是否分配成功。

最后,也是最重要的,申请内存后,应当及时释放。

下面是代码运行结果:

请确定要排序的数的总数:
5
请输入你要排序的5个数字:
1
2
3
4
5
排序后的顺序为:
5       4       3       2       1
请按任意键继续. . .
请确定要排序的数的总数:
a
输入的不是有效数字!
请按任意键继续. . .

注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处,如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我,谢谢大家

;