數(shù)組(二)
一、 數(shù)組的應(yīng)用
(一) 冒泡排序
冒泡排序是一種簡單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果它們的順序錯(cuò)誤就把它們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端。
- 算法描述
- 比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換它們兩個(gè);
- 對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì),這樣在最后的元素應(yīng)該會(huì)是最大的數(shù);
- 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè);
- 重復(fù)步驟1~3,直到排序完成。
- 動(dòng)圖演示
https://images2017.cnblogs.com/blog/849589/201710/849589-20171015223238449-2146169197.gif - 分析過程
int[] nums={9,8,7,6,5,4,3,2,1,0}; 0,1,2,3,4,5,6,7,8,9
第一趟比較:8 7 6 5 4 3 2 1 0 9 交換了9次
第二趟比較:7 6 5 4 3 2 1 0 8 9 交換了8次
第三趟比較:6 5 4 3 2 1 0 7 8 9 交換了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次 - 代碼演示
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í) - 練習(xí)1
需求
定義一個(gè)大小為10的整型數(shù)組,用隨機(jī)產(chǎn)生的數(shù)據(jù)為數(shù)組元素賦值,并將它們按從大到小的順序排列
參考代碼
Random 類
Random類默認(rèn)的無參構(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)
- 練習(xí)2
需求
步驟:
1.定義數(shù)組存儲(chǔ)價(jià)格,并利用循環(huán)輸入。
2.定義變量min保存當(dāng)前的最低價(jià)。
- 將min和數(shù)組中的其余元素依次比較。
(三) 作業(yè)
需求
實(shí)現(xiàn)用戶隨機(jī)輸入6個(gè)整數(shù),按從大到小排列實(shí)現(xiàn)思路
- 定義數(shù)組存放用戶輸入的數(shù)據(jù)
- 使用冒泡排序算法
- 循環(huán)輸出交換后的數(shù)組
二、 二維數(shù)組
(一) 值類型和引用類型
描述
前面介紹的基本數(shù)據(jù)類型都是值類型,到目前為止,我們學(xué)過的引用類型只有字符串和數(shù)組,那么值類型和引用類型有什么區(qū)別呢?
值類型的存儲(chǔ)空間是分配在棧(stack)中,引用類型的存儲(chǔ)空間是分配在堆(heap)中。數(shù)組屬于引用類型,所以如下代碼代表的意思是:
int[] arr = { 1, 3, 5, 7, 9 };
數(shù)組的各個(gè)元素在中分配,并按順序依次排列。而變量arr分配于棧上,它存放的是一個(gè)內(nèi)存地址的指針,這個(gè)指針指向堆中數(shù)組元素的地址。
也就是說,可以通過變量arr找到堆上的數(shù)組元素。-
演示
下面通過例子來演示值類型和引用類型的區(qū)別
代碼
/**
* 值類型演示
* */
int num1 = 100;
int num2 = num1;
num1 = 50;
Console.WriteLine("num1={0},num2={1}", num1, num2);/** * 引用類型的演示 * */ 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] + ","); }
分析過程
(二) 二維數(shù)組
概念
二維組有兩索引(索引號(hào)都是從0開始),其中一個(gè)表示行,一個(gè)表示列。從概念上講,二維數(shù)組就像一個(gè)具有行和列的表格一樣。定義和創(chuàng)建
定義一個(gè)3行2列的數(shù)組
int[,] arr = new int[3, 2];
注:在聲明或創(chuàng)建數(shù)組時(shí),[]內(nèi)的逗號(hào)數(shù)目加1即維度數(shù)加1初始化
聲明時(shí)初始化
int[,] number = new int[3, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 } };
省略數(shù)組大小初始化
int[,] number = new int[, ] { { 1, 2 }, { 3, 4 }, { 5, 6 } };
省略new關(guān)鍵字初始化
int[,] number = { { 1, 2 }, { 3, 4 }, { 5, 6 } };-
使用數(shù)組
獲得元素
二維數(shù)組元素的引用方式為
數(shù)組名[下標(biāo)表達(dá)式1,下標(biāo)表達(dá)式2]
注:下標(biāo)都是從0開始
獲得第一行第2列元素的值
Console.WriteLine(number[0, 1]);
獲得多維數(shù)組的長度
? Rank:返回?cái)?shù)組的維數(shù)
? GetLength(0):返回?cái)?shù)組第一維的長度
? GetLength(1):返回?cái)?shù)組第二維的長度
? GetUpperBound(0):返回第一維的最大下標(biāo)值
? GetUpperBound(1):返回第二維的最大下標(biāo)值
注:GetUpperBound(0)= GetLength(0)-1
Console.WriteLine("數(shù)組的維數(shù):"+arr.Rank);
Console.WriteLine("第1維數(shù)組的長度" + arr.GetLength(0));
Console.WriteLine("第1維數(shù)組的最大下標(biāo)" + arr.GetUpperBound(0));
遍歷二維數(shù)組
使用雙重for循環(huán)
for (int i = 0; i < arr.GetLength(0); i++)
{
for (int j = 0; j < arr.GetLength(1); j++)
{
Console.Write("arr[{0},{1}]={2}\t", i, j, arr[i, j]);
}
Console.WriteLine();
}
使用foreach循環(huán)
foreach (var item in number)
{
Console.Write(item + " ");
}
三、 動(dòng)態(tài)數(shù)組
(一) 概念
所謂動(dòng)態(tài)數(shù)組是指在程序運(yùn)行時(shí)可以動(dòng)態(tài)改變數(shù)組長度。前面所介紹的數(shù)組,相對(duì)應(yīng)的被稱為靜態(tài)數(shù)組,即定義數(shù)組后,就無法更改數(shù)組長度。
在C#中,如果需要使用動(dòng)態(tài)數(shù)組,可以使用ArrayList,不過需要在程序開頭添加一個(gè)引用
using System.Collections
注:動(dòng)態(tài)數(shù)組只能是一維的。
(二) ArrayList的聲明與創(chuàng)建
有二種方式:創(chuàng)建時(shí)聲明一個(gè)初始長度,或不聲明初始長度
ArrayList list = new ArrayList();ArrayList list2 = new ArrayList(10);//初始長度為10
注意:
初始長度僅僅是系統(tǒng)給數(shù)組開辟了一個(gè)空間,并沒有實(shí)際使用,所以在未使用的狀態(tài)下,其長度還是為0;
ArrayList的長度即元素的個(gè)數(shù)用count屬性來表示
Console.WriteLine(list2.Count); //返回結(jié)果是list2中的元素個(gè)數(shù)
(三) ArrayList的操作
- 賦值:順序添加
通過Add()方法,給ArrayList添加一個(gè)元素
ArrayList arrayList = new ArrayList(10);//初始長度為10
arrayList.Add(100); //向第一個(gè)元素賦值
arrayList.Add(200);//向第二個(gè)元素賦值 - 賦值:插入到指定的位置
insert(下標(biāo),元素值):下標(biāo)從0開始,
下標(biāo)不能超過原有數(shù)組的長度
arrayList.Insert(1, 400); //400插入到下標(biāo)為1的位置上,原先下標(biāo)為1的元素值被”擠“到后面一個(gè)位置上,依次類推 - 刪除元素:刪除指定值的元素
remove():刪除第一個(gè)與指明匹配的元素
ArrayList mylist = new ArrayList(5);
mylist.Add(200);
mylist.Add(100);
mylist.Add(200);
mylist.Add(300);
mylist.Add(100);
foreach (var item in mylist)
{
Console.Write(item + " ");
}
mylist.Remove(100);
Console.Write("\n");
foreach (var item in mylist)
{
Console.Write(item + " ");
}
removeAt():刪除指定下標(biāo)的元素
mylist.Remove(1);//刪除下標(biāo)為1的元素
removeRange()方法用于刪除一定范圍的元素
remove(int index,int count)
index:表示從第幾個(gè)開始刪除(從0開始計(jì)算),
count:表示要?jiǎng)h除的個(gè)數(shù)
mylist.RemoveRange(1, 3);//表示從下標(biāo)為1的元素開始,刪除3個(gè)元素
四、 作業(yè)
(一) 問題描述
有一組學(xué)員的成績{99,85,82,63, 60},將它們按升序排列。要增加一個(gè)學(xué)員的成績,將它插入成績序列,并保持升序。