#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
输入的不是有效数字!
请按任意键继续. . .
注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处,如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我,谢谢大家