洛谷 P5724 【深基4.习5】求极差 / 最大跨度值

题目描述
给出n 和n 个整数ai,求这n 个整数中的极差是什么。极差的意思是一组数中的最大值减去最小值的差。

输入格式
第一行输入一个正整数n,表示整数个数。

第二行输入n 个整数a1,a2…an,以空格隔开。

输出格式
输出一个整数,表示这n 个整数的极差。

输入输出样例

输入 

6
4 1 5 1 4 1

输出 

4

本题重点在于将n个数进行排序。趁此机会,我使用了三种排序方法,分别是 冒泡排序、选择排序以及插入排序。

1.冒泡排序

冒泡排序最简单的排序算法之一,一次比较两个元素,如果他们的顺序错误就将位置互换。

#include<stdio.h>
int arr[101] = { 0 };
int n = 0;

//   冒泡排序
void fun1(void)
{
	int temp = 0;
	for (int i = 0; i < n - 1; i++)   //当i=n-1是因为保证后面的arr[j+1]在范围内
	{                                 //即当j=n-i时,arr[j+1]是最后一个数
		for (int j = 0; j < n - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
int main()
{
	scanf("%d", &n);

	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	fun1();
	printf("%d\n", arr[n - 1] - arr[0]);
	return 0;
}

2.选择排序

先在未排序数组元素中找到最小元素,存放到排序序列的起始位置。

再从剩余未排序元素中寻找最小元素,然后放到已排序序列的后面。

重复进行第二步,直至所有元素由小到大排列。

#include<stdio.h>
int arr[101] = { 0 };
int n = 0;


//   选择排序
void fun2(void)
{
	int temp = 0;
	for (int i = 0; i < n - 1; i++)
	{
		int min = i;
		for (int j = i + 1; j < n; j++)
		{
			if (arr[min] > arr[j])
			{
				min = j;  //记录最小值
			}
		}
		//进行交换
		temp = arr[i];
		arr[i] = arr[min];
		arr[min] = temp;
	}
}

int main()
{
	scanf("%d", &n);

	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	fun2();
	printf("%d\n", arr[n - 1] - arr[0]);
	return 0;
}

3.插入排序

排序过程与扑克牌理牌方法类似,先取前两个数排序,再逐个取剩下的元素,在已排序序列中从后向前扫描,找到相应位置并插入。(具体实现过程在注释中介绍)

#include<stdio.h>
int arr[101] = { 0 };
int n = 0;


//    插入排序
//先取前两个数,再取后面的数逐个插入
void fun3(void)
{
	int j=0;
	int temp = 0;
	for (int i = 1; i < n; i++)
	{
		if (arr[i] < arr[i - 1])
		{
			temp = arr[i];  //将取的数的值赋值给temp
			j = i - 1;  //j是需要比较的数的下标,从后向前比较
			while (j >= 0 && temp < arr[j])
			{
				arr[j + 1] = arr[j];  //比较的数大于temp,该数后移一位
				j--;   //接着和前一个数比较
			}
            //temp>=arr[j],temp遇到更小的数,且比temp大的数均完成后移
			arr[j + 1] = temp;  //将temp存入空出的arr[j+1]中
			//如果没有执行上述循环,则表示temp为已排序数中最大的
			//将temp在已排序数后面的一位存上即可
		}
	}
}

int main()
{
	scanf("%d", &n);

	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	fun3();
	printf("%d\n", arr[n - 1] - arr[0]);
	return 0;
}

为了方便介绍这三种排序方法,我将排序过程单独写入子函数中。如果只想写入main函数中,只需将子函数放入fun()的位置。

  • 18
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值