數(shù)組(二)
一、 數(shù)組的應(yīng)用
(一) 冒泡排序
冒泡排序是一種簡(jiǎn)單的排序算法。它重復(fù)地走訪過(guò)要排序的數(shù)列,一次比較兩個(gè)元素,如果它們的順序錯(cuò)誤就把它們交換過(guò)來(lái)。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說(shuō)該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來(lái)是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端。
1. 算法描述
比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換它們兩個(gè);
對(duì)每一對(duì)相鄰元素作同樣的工作,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì),這樣在最后的元素應(yīng)該會(huì)是最大的數(shù);
針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè);
重復(fù)步驟1~3,直到排序完成。
2. 動(dòng)圖演示
https://images2017.cnblogs.com/blog/849589/201710/849589-20171015223238449-2146169197.gif
3. 分析過(guò)程
int[] nums={9,8,7,6,5,4,3,2,1,0}; 0,1,2,3,4,5,6,7,8,9 len = 10
第一趟比較:8 7 6 5 4 3 2 1 0 9 交換了9次 i=0 9 len-1-i
第二趟比較:7 6 5 4 3 2 1 0 8 9 交換了8次 i= 1 8
第三趟比較:6 5 4 3 2 1 0 7 8 9 交換了7次 i=2 7
第四趟比較:5 4 3 2 1 0 6 7 8 9 交換了6次
第五趟比較:4 3 2 1 0 5 6 7 8 9 交換了5次
第六趟比較:3 2 1 0 4 5 6 7 8 9 交換了4次
第七趟比較:2 1 0 3 4 5 6 7 8 9 交換了3次
第八趟比較:1 0 2 3 4 5 6 7 8 9 交換了2次
第九趟比較:0 1 2 3 4 5 6 7 8 9 交換了1次
4. 代碼演示
int[] nums = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
for (int i = 0; i < nums.Length-1; i++) //比較的次數(shù)
{
for (int j = 0; j < nums.Length-1-i; j++) //交換的次數(shù)
{
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
(二) 練習(xí)
1. 練習(xí)1
需求
定義一個(gè)大小為10的整型數(shù)組,用隨機(jī)產(chǎn)生的數(shù)據(jù)為數(shù)組元素賦值,并將它們按從大到小的順序排列
參考代碼
Random 類(lèi)
Random類(lèi)默認(rèn)的無(wú)參構(gòu)造函數(shù)可以根據(jù)當(dāng)前系統(tǒng)時(shí)鐘為種子,進(jìn)行一系列算法得出要求范圍內(nèi)的偽隨機(jī)數(shù)
Random rd = new Random()
rd.next(1,10)(生成1~10之間的隨機(jī)數(shù),不包括10)
(三) 作業(yè)
1. 作業(yè)1
需求
<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"><v:formulas></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path></v:stroke></v:shapetype><v:shape id="圖片_x0020_16" o:spid="_x0000_i1027" type="#_x0000_t75" alt="圖8.13.BMP" style="width:257.25pt;height:211.5pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png" o:title="圖8.13"></v:imagedata></v:shape>
步驟:
1.定義數(shù)組存儲(chǔ)價(jià)格,并利用循環(huán)輸入。
2.定義變量min保存當(dāng)前的最低價(jià)。
3. 將min和數(shù)組中的其余元素依次比較。
2. 作業(yè)2
需求
實(shí)現(xiàn)用戶隨機(jī)輸入6個(gè)整數(shù),按從大到小排列
<v:shape id="Picture_x0020_2" o:spid="_x0000_i1026" type="#_x0000_t75" alt="Snap1" style="width:229.5pt;
height:131.25pt;visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image002.png" o:title="Snap1" grayscale="t"></v:imagedata></v:shape>
實(shí)現(xiàn)思路
定義數(shù)組存放用戶輸入的數(shù)據(jù)
使用冒泡排序算法
循環(huán)輸出交換后的數(shù)組
二、 二維數(shù)組
(一) 值類(lèi)型和引用類(lèi)型
1. 描述
前面介紹的基本數(shù)據(jù)類(lèi)型都是值類(lèi)型,到目前為止,我們學(xué)過(guò)的引用類(lèi)型只有字符串和數(shù)組,那么值類(lèi)型和引用類(lèi)型有什么區(qū)別呢?
值類(lèi)型的存儲(chǔ)空間是分配在棧(stack)中,引用類(lèi)型的存儲(chǔ)空間是分配在堆(heap)中。數(shù)組屬于引用類(lèi)型,所以如下代碼代表的意思是:
int[] arr = { 1, 3, 5, 7, 9 };
數(shù)組的各個(gè)元素在中分配,并按順序依次排列。而變量arr分配于棧上,它存放的是一個(gè)內(nèi)存地址的指針,這個(gè)指針指向堆中數(shù)組元素的地址。
也就是說(shuō),可以通過(guò)變量arr找到堆上的數(shù)組元素。
<v:shape id="圖片_x0020_1" o:spid="_x0000_i1025" type="#_x0000_t75" style="width:191.25pt;height:108.75pt;visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image003.png" o:title=""></v:imagedata></v:shape>
2. 演示
下面通過(guò)例子來(lái)演示值類(lèi)型和引用類(lèi)型的區(qū)別
代碼
/**
值類(lèi)型演示
*/
int num1 = 100;
int num2 = num1;
num1 = 50;
Console.WriteLine("num1={0},num2={1}", num1, num2);
/**
引用類(lèi)型的演示
*/
int[] arr1 = { 1, 3, 5, 7, 9 };
int[] arr2 = arr1;
arr1[0] = 500;
Console.Write("arr1的值是");
for (int i = 0; i < arr1.Length; i++)
{
Console.Write(arr1[i] + ",");
}
Console.Write("arr2的值是");
for (int i = 0; i < arr2.Length; i++)
{
Console.Write(arr2[i] + ",");
}
分析過(guò)程
=u}?o8?