2018-12-12

數(shù)組(二)
一、 數(shù)組的應(yīng)用
(一) 冒泡排序
冒泡排序是一種簡單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果它們的順序錯(cuò)誤就把它們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端。

  1. 算法描述
  1. 比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換它們兩個(gè);
  2. 對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì),這樣在最后的元素應(yīng)該會(huì)是最大的數(shù);
  3. 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè);
  4. 重復(fù)步驟1~3,直到排序完成。
  1. 動(dòng)圖演示
    https://images2017.cnblogs.com/blog/849589/201710/849589-20171015223238449-2146169197.gif
  2. 分析過程
    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次
  3. 代碼演示
    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í)
  4. 練習(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)

  1. 練習(xí)2
    需求

步驟:
1.定義數(shù)組存儲(chǔ)價(jià)格,并利用循環(huán)輸入。
2.定義變量min保存當(dāng)前的最低價(jià)。

  1. 將min和數(shù)組中的其余元素依次比較。

(三) 作業(yè)

  1. 需求
    實(shí)現(xiàn)用戶隨機(jī)輸入6個(gè)整數(shù),按從大到小排列

  2. 實(shí)現(xiàn)思路

  1. 定義數(shù)組存放用戶輸入的數(shù)據(jù)
  2. 使用冒泡排序算法
  3. 循環(huán)輸出交換后的數(shù)組

二、 二維數(shù)組
(一) 值類型和引用類型

  1. 描述
    前面介紹的基本數(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ù)組元素。

  2. 演示
    下面通過例子來演示值類型和引用類型的區(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ù)組

  1. 概念
    二維組有兩索引(索引號(hào)都是從0開始),其中一個(gè)表示行,一個(gè)表示列。從概念上講,二維數(shù)組就像一個(gè)具有行和列的表格一樣。

  2. 定義和創(chuàng)建
    定義一個(gè)3行2列的數(shù)組
    int[,] arr = new int[3, 2];
    注:在聲明或創(chuàng)建數(shù)組時(shí),[]內(nèi)的逗號(hào)數(shù)目加1即維度數(shù)加1

  3. 初始化
    聲明時(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 } };

  4. 使用數(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的操作

  1. 賦值:順序添加
    通過Add()方法,給ArrayList添加一個(gè)元素
    ArrayList arrayList = new ArrayList(10);//初始長度為10
    arrayList.Add(100); //向第一個(gè)元素賦值
    arrayList.Add(200);//向第二個(gè)元素賦值
  2. 賦值:插入到指定的位置
    insert(下標(biāo),元素值):下標(biāo)從0開始,
    下標(biāo)不能超過原有數(shù)組的長度
    arrayList.Insert(1, 400); //400插入到下標(biāo)為1的位置上,原先下標(biāo)為1的元素值被”擠“到后面一個(gè)位置上,依次類推
  3. 刪除元素:刪除指定值的元素
    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é)員的成績,將它插入成績序列,并保持升序。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 數(shù)組(二) 一、 數(shù)組的應(yīng)用 (一) 冒泡排序 冒泡排序是一種簡單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較...
    拾起_518閱讀 320評(píng)論 0 0
  • 在C語言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,007評(píng)論 0 2
  • 【程序1】 題目:古典問題:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子長到第三個(gè)月后每個(gè)月又生一對(duì)兔...
    開心的鑼鼓閱讀 3,393評(píng)論 0 9
  • 今年四十歲的吳峰,經(jīng)營著兩家公司,一家做新營銷,一家做政府采購項(xiàng)目的招投標(biāo),近幾年國家財(cái)政充裕,加上人...
    大道至簡_acbd閱讀 165評(píng)論 0 0
  • 滴滴打車更名滴滴出行,而一兩個(gè)月前,的士和專車(對(duì)于私家車的統(tǒng)稱,包括所謂的滴滴打車等)間的沖突不斷,現(xiàn)已有了一定...
    知奇者也閱讀 333評(píng)論 0 1

友情鏈接更多精彩內(nèi)容