题目描述
给出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()的位置。