C语言对数组进行排序

本文探讨了如何通过动态在堆中申请内存来避免数组长度固定带来的问题,重点介绍了使用选择排序算法对动态数组进行排序的过程,以及内存管理的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对数组进行排序的方法有很多,我选择使用最基础的选择排序,在创建一个数组用于存放数据的时候,我们并不知道需要进行排序的数据个数有多少,如果固定数组的长度,就会使得程序变得不够方便,若我们创建一个超长的数组,虽然解决了数组长度不够的问题,但每个函数的栈区时有限的,这样创建会很浪费空间。我可以在堆中去动态申请内存,由于对的空间大,且可以根据我的数据个数来申请一个数组。
  这是申请内存的简单介绍。
#include <stdio.h>
#include <stdlib.h>  // 也可使用 #include <malloc.h> 

int main()
{
	int *list = NULL, list_len;  // list指针用于指向申请到的数组, list_len 为需要申请的数组大小 
	printf(">>>");
	scanf("%d",&list_len);
	list = (int *)malloc(list_len * sizeof(int));  // 申请内存需要用到 malloc函数,第一个括号中为需要申请的数据类型,第二个括号为需要申请的内存大小 
	free(list);  // 对于申请到内存,使用完毕后需要释放 
	return 0;
}

然后就可以进行排序

#include <stdio.h>
#include <stdlib.h>


int input_num(int *list,int *len_list);
int sort_list(int *list, int *len_list);
int printf_list(int *list, int *len_list);
int create_list(int *len_list, int **list);


int main()
{
	int *list = NULL, len_list;   //  list为指向从堆中申请到的数组 , len_list 为需要进行比较的元素个数 
	if ( !create_list(&len_list, &list)) 
		return 0;   // 申请失败,程序结束 
	input_num(list, &len_list);
	sort_list(list, &len_list);
	printf_list(list, &len_list);
	free(list);   // 释放掉数组 
	return 1;
}


int input_num(int *list, int *len_list)   // 向数组中写入数据 , len_list为数据的个数 
{
	int num,n;
	for (n = 0; n < *len_list; n++)
	{
		printf("请输入第%d为整数:",n+1);  
		scanf("%d",list+n);
	}
	return 1;
}


int create_list(int *len_list, int **list)   // 从堆中申请一个数组,用于存放数据 
{
	printf("请输入你需要输入多少为整数:");   // 获取的数组的长度 
	scanf("%d",len_list);
	if ((*list = (int *)malloc(*len_list * sizeof(int))) == NULL)   // 申请数组,并将申请到的数组的地址给指针list 
	{
		printf("申请失败!");
		return 0;  // 申请失败,返回0,便于在主函数中判断 
	}
	return 1; // 申请成功,返回1 
}


int sort_list(int *list, int *len_list)   // 对数组的元素进行排序 
{
	int i,n,temp;   //  temp为一个中间变量,便于方便交换值 
	for (i = 0; i < (*len_list) - 1; i++)
	{
		for (n = i+1; n < *len_list; n++)
		{
			if (*(list+i) > *(list+n))
			{
				temp = *(list+i);
				*(list+i) = *(list+n);
				*(list+n) = temp;	
			}
		}
	}
	return 1;
}


int printf_list(int *list, int *len_list)  // 输出数组中排序完成的所有值 
{
	int i;
	for (i = 0; i < *len_list; i++)
		printf("%d\n",*(list+i));
	return 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值