【C#】数组的最大最小值

定义一个数组,当这个数组了存满了数据,一般的操作:求和,求平均值,最大值,最小值。容易出错的是求最大最小值,因为这里面涉及到数组元素的比较!
最近看的C#视频中有几个有意思的求法!

int[] numbers = new int[] { -1, -56, -861, 45, 68, 48, 52, 45, 96, 42, 454 };//出现相同会不会报错?
int temp = 0;

for (int i = 0; i < numbers.Length - 1; i++)
{
	if (numbers[i] > numbers[i + 1])   //最后一个和谁去比?所以比较的时候不能比较到数组最后一个元素,到倒数第二个元素就停止
    {
          temp = numbers[i];
    }
    else
    {
          temp = numbers[i + 1];
    }
}
    Console.WriteLine("最大值为{0}", temp);
    Console.ReadKey();

上面这段代码的核心思想:从前到后依次两个数组元素做比较,符合条件就给了临时变量temp并输出
存在的问题:for循环的最后一个元素是数组的倒数第二个元素,如果for循环中能够取到最后一个元素,那最后一个元素再去和它的下一个元素比较时就会出错,所以只能取到倒数第二个元素就停止,保证它能够有比较的对象!



int[] numbers = new int[] { -1, -56, -861, 45, 68, 48, 52, 45, 96, 42, 454 };
int temp = 0;

for (int i = 0; i < numbers.Length - 1; i++)
{
     if (numbers[i] < numbers[i + 1])   //这时候比较元素就不能写0,无法比较出负数
     {
          temp = numbers[i];
     }
     else
     {
          temp = numbers[i + 1];
     }
}

     Console.WriteLine("最小值为{0}", temp);
     Console.ReadKey();

上面这段代码的核心思想:从前到后依次两个数组元素做比较,符合条件就给了临时变量temp并输出
存在的问题
1.单独只有负数是正确输出,如果有正有负(而且正数在后面,比到后面就会把正数中最小的输出)
2.先是负数部分比较完成,再是一正一负比较完成,在比到两个正数的时候,带有负数的比较结果被覆盖掉
3.所以代码适合只有负数的情况

由于依次比较所以才会有问题,所以不让数组元素内部依次比较了,给找个统一的标准

int[] nums = new int[] { 45, 85, -54, 964, 53, -12 };
int min = int.MaxValue;//最小值
int max = int.MinValue;//最大值
for (int i = 0; i < nums.Length; i++)
{
    if (nums[i] > max)
	{
    max = nums[i];//求最大值
	}
if (nums[i] < min)//求最小值,每次都是和(比较过的所有)在做比较,而不是两两作比较
	{
    min = nums[i];
	}
}
Console.WriteLine("最大值为{0}", max);
Console.WriteLine("最小值为{0}", min);
Console.ReadKey();

上面这段代码的核心思想:定义一个最大值和最小值,先和这个最值比较,这样每次都是和(比较过的所有)在做比较,而不是两两作比较,就不会出现上面的数值被覆盖的问题!
有意思的事情
1.要比较出最大值,第一个却是和int.MinValue作比较,因为没有比这个再小的值了,保证比较的第一个值能够成为目前最大的值
2.要比较出最小值,第一个却是和int.MaxValue作比较,因为没有比这个再大的值了,保证比较的第一个值能够成为目前最小的值


数组中的元素通常随意的存入,但需要它按照顺序输出,此时就先需要给数组元素排个序,比较经典的冒泡排序法(发明的人估计是在和饮料的时候盯着发呆了好久吧)

int[] nums = new int[] { 65, 898, 46, 65, 465, 454, 78, 21 };
int temp = 0;
for (int j = 0; j < nums.Length - 1; j++)
{
    for (int i = 0; i < nums.Length - 1 - j; i++)
    {
        if (nums[i] < nums[i + 1])//从小到大用>,从大到小用<
        {
            temp = nums[i];
            nums[i] = nums[i + 1];
            nums[i + 1] = temp;
        }
    }
}

for (int i = 0; i < nums.Length; i++)
{
    Console.Write(nums[i] + "\t");
}
Console.ReadKey();

这个算法需要先在纸上理解一遍,这个算法比较笨!
1.先拿出一个数组元素和它的下一个数组元素比较,如果满足条件,就调换;否则就拿当前数组元素的下一个数组元素和再下一个数组元素进行比较
2.当把你拿到的这个元素和其他元素都比较完了,到了当前比较顺序的合适位置的时候
3.在重头开始再拿下一个元素和所有做比较!


也可以利用C#语言中的排序类
这个是通过专门给数组排序的类来完成,但结果是从小到大,不能像冒泡排序法那样从大到小

int[] nums = new int[] { 465, 464, 31, 897, 138, 281, 487 };
Array.Sort(nums);//排序(从小到大)函数,C#里成为类,不叫函数

for (int i = 0; i < nums.Length; i++)//将Array.sort的结果输入
{
    Console.Write(nums[i] + "\t");
}
    Console.ReadKey();

可以通过这样的办法从大到小排序

int[] nums = new int[] { 465, 464, 31, 897, 138, 281, 487 };
Array.Sort(nums);//排序(从小到大)函数,C#里成为类,不叫函数
Array.Reverse(nums);//这是一个反转函数,如果提前已经排序,得到的就是从大到小的
for (int i = 0; i < nums.Length; i++)//将Array.sort的结果输入
{
    Console.Write(nums[i] + "\t");
}
    Console.ReadKey();

也可以通过排序类Array.sort+倒序输出来完成

int[] nums = new int[] { 465, 464, 31, 897, 138, 281, 487 };
Array.Sort(nums);//排序(从小到大)函数,C#里成为类,不叫函数
for (int i = nums.Length - 1; i >= 0; i--)//将Array.sort的结果逆向输入=Array.sort+Array.Reverse
{
    Console.Write(nums[i] + "\t");
}
  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
在C#中,可以使用循环来数组最大值和最小值。在给定的代码片段中,引用演示了如何找到数组最大值,而引用演示了如何找到数组最小值。 要找到数组最大值,可以使用以下步骤: 1. 首先,定义一个整数变量max,并将其初始化为数组的第一个元素a。 2. 然后,使用一个循环遍历数组中的每个元素。在循环中,从索引0开始,逐个增加索引i,直到i小于数组的长度a.Length。 3. 在循环体中,使用条件语句判断当前元素a[i]是否大于max。如果是,则更新max的值为当前元素a[i]。 4. 循环结束后,max的值将是数组最大值。 5. 最后,使用Console.WriteLine语句将max的值打印出来。 要找到数组最小值,可以使用类似的步骤: 1. 首先,定义一个整数变量min,并将其初始化为数组的第一个元素a。 2. 然后,使用一个循环遍历数组中的每个元素。在循环中,从索引0开始,逐个增加索引i,直到i小于数组的长度a.Length。 3. 在循环体中,使用条件语句判断当前元素a[i]是否小于min。如果是,则更新min的值为当前元素a[i]。 4. 循环结束后,min的值将是数组最小值。 5. 最后,使用Console.WriteLine语句将min的值打印出来。 所以,对于给定的数组{10, 9, 6, 4234, 312},最大值是4234,最小值是6。 而对于数组{10, 1, 5, 6123, 34},最大值是6123,最小值是1。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值