C語言II博客作業02


這個作業屬於哪個課程: C語言程序設計
這個作業要求在哪里: 作業要求
這個作業的目標: 知道在哪種情況下可以使用構造數據類型—數組進行數據的處理,掌握用一維數組進行編程,掌握選擇排序法和二分查找法
學號: 20208980

2.1 完成PTA作業,並給出編程題完成截圖(5分)

7-1 年齡與疾病 (10 分)

7-2 選擇排序法 (100 分)

2.2 題目:快速尋找滿足條件的兩個數

能否快速找出一個數組中的兩個數字,讓這兩個數字之和等於一個給定的值,為了簡化起見,我們假設這個數組中肯定存在至少一組符合要求的解。
解法一:采用窮舉法,從數組中任意取出兩個數字,計算兩者之和是否為給定的數字。
解法二:對數組中的每個數字arr[i]都判別Sum-arr[i]是否在數組中。
解法三:對數組進行排序,然后使用二分查找法針對arr[i]查找Sum-arr[i]。
要求:

1.根據三種解法給出相應的代碼,並給出測試數據。(15分)

解法一:

測試數據1: 1 10 3 4 2 21 9 6 11 5
測試數據2: 3 2 11 4 8 5 10 7 9 22
測試數據3: 10 19 3 8 1 3 4 9 11 2

解法二:

測試數據1: 1 10 3 4 2 21 9 6 11 5
測試數據2: 3 2 11 4 8 5 10 7 9 22
測試數據3: 10 19 3 8 1 3 4 9 11 2

解法三:數組排成有序代碼省略,重頭菜如下:

測試數據1: 1 10 3 4 2 21 9 6 11 5
測試數據2: 3 2 11 4 8 5 10 7 9 22
測試數據3: 10 19 3 8 1 3 4 9 11 2

2.請說明三種算法的區別是什么?你還可以給出更好的算法嗎?(10分)

算法一:代碼簡單,但是效率不高,算法運算時間和復雜度不夠理想。
算法二:1.提高查找效率通常可以先將要查找的數組排序,然后用二分查找等方法進行查找,在解法一的基礎上時間折扣,效率提高。
算法三:假設已經有了這個數組的任意兩個元素之和的有序數組,再利用二分查找法,然后令i=0,j=n-1,看arr[i] + arr[j] 是否等於Sum,如果是,則結束。如果小於Sum,則i = i + 1;如果大於Sum,則 j = j – 1。這樣只需要在排好序的數組上遍歷一次,就可以得到最后的結果,2.如果數組是無序的,先排序,然后用兩個指針i,j,各自指向數組的首尾兩端,令i=0,j=n-1,然后i++,j--,逐次判斷a[i]+a[j]?=sum,
如果某一刻a[i]+a[j] > sum,則要想辦法讓sum的值減小,所以此刻i不動,j--;
如果某一刻a[i]+a[j] < sum,則要想辦法讓sum的值增大,所以此刻i++,j不動。
如果原數組是有序的,則不需要事先的排序,直接用兩指針分別從頭和尾向中間掃描,

2.3 請搜索有哪些排序算法,並用自己的理解對集中排序算法分別進行描述(5分)

插入排序,冒泡排序,選擇排序,快速排序,歸並排序

插入排序:插入排序算法是基於某序列已經有序排列的情況下,通過一次插入一個元素的方式按照原有排序方式增加元素。

冒泡排序:冒泡排序算法是把較小的元素往前調或者把較大的元素往后調。

選擇排序:選擇排序算法的基本思路是為每一個位置選擇當前最小的元素。

快速排序:快速排序的基本思想是:通過一趟排序算法把所需要排序的序列的元素分割成兩大塊,其中,一部分的元素都要小於或等於另外一部分的序列元素,然后仍根據該種方法對划分后的這兩塊序列#的元素分別再次實行快速排序算法,排序實現的整個過程可以是遞歸的來進行調用,最終能夠實現將所需排序的無序序列元素變為一個有序的序列。

歸並排序:歸並排序算法就是把序列遞歸划分成為一個個短序列,以其中只有1個元素的直接序列或者只有2個元素的序列作為短序列的遞歸出口,再將全部有序的短序列按照一定的規則進行排序為長序列。

2.4 請給出本周學習總結(15分)

1 學習進度條(5分)

2 累積代碼行和博客字數(5分)

3 學習內容總結和感悟(5分)

內容總結:通過這一周的學習,我們了解了什么是數組,數組的定義與引用,如何對數組賦初值,如何引用數組解決實際問題。

感悟:

1.數組就是一塊連續的格式化的內存,可以通過數字下標索引直接找到對應元素,查找速度很快。
2.玩數組就是玩下標,數組下標越界只是一個傳說。
3.數組名稱玩得好就是指針TQL

關於冒泡排序:

冒泡排序是最簡單的排序方法,理解起來容易。雖然它的計算步驟比較多,不是最快的,但它是最基本的,初學者一定要掌握。

冒泡排序的原理是:從左到右,相鄰元素進行比較。每次比較一輪,就會找到序列中最大的一個或最小的一個。這個數就會從序列的最右邊冒出來。

以從小到大排序為例,第一輪比較后,所有數中最大的那個數就會浮到最右邊;第二輪比較后,所有數中第二大的那個數就會浮到倒數第二個位置……就這樣一輪一輪地比較,最后實現從小到大排序。

比如對下面這個序列進行從小到大排序:
90 21 132 -58 34

第一輪:

  1. 90 和 21比,90>21,則它們互換位置:
    21 90 132 -58 34

  2. 90 和 132 比,90<132,則不用交換位置。
    3)132 和 –58 比,132>–58,則它們互換位置:
    21 90 -58 132 34

4)132 和 34 比,132>34,則它們互換位置:
21 90 -58 34 132

到此第一輪就比較完了。第一輪的結果是找到了序列中最大的那個數,並浮到了最右邊。

比較時,每輪中第 n 次比較是新序列中第 n 個元素和第 n+1 個元素的比較(假如 n 從 1 開始)。

第二輪:

  1. 21 和 90 比,21<90,則不用交換位置。

  2. 90 和 –58 比,90>–58,則它們互換位置:
    21 -58 90 34 132

  3. 90 和 34 比,90>34,則它們互換位置:
    21 -58 34 90 132

到此第二輪就比較完了。第二輪的結果是找到了序列中第二大的那個數,並浮到了最右邊第二個位置。

第三輪:

  1. 21 和 –58 比,21>–58,則它們互換位置:
    -58 21 34 90 132

  2. 21 和 34 比,21<34,則不用交換位置。

到此第三輪就比較完了。第三輪的結果是找到了序列中第三大的那個數,並浮到了最右邊第三個位置。

第四輪:

  1. –58 和 21 比,–58<21,則不用交換位置。

至此,整個序列排序完畢。從小到大的序列就是“–58 21 34 90 132”。從這個例子中還可以總結出,如果有 n 個數據,那么只需要比較 n–1 輪。而且除了第一輪之外,每輪都不用全部比較。因為經過前面輪次的比較,已經比較過的輪次已經找到該輪次中最大的數並浮到右邊了,所以右邊的數不用比較也知道是大的。

下面寫一個程序:

輸出結果是:
2500 900 543 532 76 56 43 35 34 32 3 2 -58 -70 -234

程序中,為什么每輪比較的次數是 j<n–1–i,而不是 j<n–1?

因為冒泡排序有一個特點,這個程序是從大到小排序,所以第一輪排序以后,最小的數就會浮到最右面;第二輪排序以后,第二小的數會浮到倒數第二個位置;第三輪排序以后,第三小的數會浮到倒數第三個位置……也就是說,排序多少輪,就有多少個數字已經按排序要求排好了,它們不需要再比較。寫 j<n–1 也可以,只不過程序在執行時多做了許多無用功。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM