【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");
}
總結
以上是生活随笔為你收集整理的【C#】数组的最大最小值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C#】枚举_结构体_数组
- 下一篇: 【C#】Out与ref是干什么的?