這個作業屬於哪個課程 | https://edu.cnblogs.com/campus/zswxy/CST2020-2 |
---|---|
這個作業要求在哪里 | https://edu.cnblogs.com/campus/zswxy/CST2020-2/homework/11810 |
這個作業的目標 | 掌握用一維數組進行編程,掌握選擇排序法和二分查找法 |
學號 | 20208993 |
2.1 完成PTA作業,並給出編程題完成截圖(5分)
7-1 年齡與疾病 :
7-2 選擇排序法:
2.2 題目:快速尋找滿足條件的兩個數
能否快速找出一個數組中的兩個數字,讓這兩個數字之和等於一個給定的值,為了簡化起見,我們假設這個數組中肯定存在至少一組符合要求的解。
解法一:采用窮舉法,從數組中任意取出兩個數字,計算兩者之和是否為給定的數字。
解法二:對數組中的每個數字arr[i]都判別Sum-arr[i]是否在數組中。
解法三:對數組進行排序,然后使用二分查找法針對arr[i]查找Sum-arr[i]。
要求:
1.根據三種解法給出相應的代碼,並給出測試數據。(15分)
解法一:
解法二:
解法三:
2.請說明三種算法的區別是什么?你還可以給出更好的算法嗎?(10分)
區別:解法一和解法二區別在於判斷arr[i]+arr[k]=sum的條件不同,其他地方沒什么區別。
但和解法三的區別就挺大,用二分法要給數組排序,比較麻煩和繁瑣,但縮短了查找時的運行時間,
我個人更偏向於前兩種解法。
更好的算法:知識受限,暫時沒想到有更好的算法。
2.3 請搜索有哪些排序算法,並用自己的理解對集中排序算法分別進行描述(5分)
冒泡排序法:比較相鄰的兩個數,如果前者比后者大,則進行交換。每一輪排序結束,選出一個未排序中最大的數放到數組后面。
升級版冒泡排序法:通過從低到高選出最大的數放到后面,再從高到低選出最小的數放到前面,如此反復,直到左邊界和右邊界重合。當數組中有已排序好的數時,這種排序比傳統冒泡排序性能稍好。
直接插入排序:和交換排序不同的是它不用進行交換操作,而是用一個臨時變量存儲當前值。當前面的元素比后面大時,先把后面的元素存入臨時變量,前面元素的值放到后面元素位置,再到最后把其值插入到合適的數組位置。
希爾(shell)排序:在直接插入排序的思想下設置一個最小增量dk,剛開始dk設置為n/2。進行插入排序,隨后再讓dk=dk/2,再進行插入排序,直到dk為1時完成最后一次插入排序,此時數組完成排序。
選擇排序:依次選出數組最小的數放到數組的前面。首先從數組的第二個元素開始往后遍歷,找出最小的數放到第一個位置。再從剩下數組中找出最小的數放到第二個位置。以此類推,直到數組有序。
2.4 請給出本周學習總結(15分)
1 學習進度條(5分)
2 累積代碼行和博客字數(5分)
3 學習內容總結和感悟(5分)
感悟:
1.在寫代碼時還是會出現小錯誤,不能一口氣寫正確,后期的查錯和修改花費較多的時間。
2.在艱難的學習同時也在進步,學到了新的知識,又能解決更多的問題。
3.感覺學習的過程比較被動,缺少主動性。
冒泡排序法的說明與理解:
比較相鄰的兩個數,如果前者比后者大,則進行交換。每一輪排序結束,選出一個未排序中最大的數放到數組后面。
例如:對arr[8]={5,8,6,2,4,7,1,3}這個數組進行冒泡排序,首先5和8進行比較,不用交換位置,其次8與6比較
交換位置,再8與2比較,交換位置,以此類推,一趟冒泡排序下來數組中最大的數字就排到了數組的最后。下面進行
第二、三、四。。。。趟冒泡排序,直到數組有序為止,8個元素要進行7趟排序,每趟排序中元素比較的次數也隨着
趟數而減少。以此推廣,n個元素的數組需要n-1趟排序。因此要使用兩個for循環,外層的for循環用來記錄趟數,
內層的for循環記錄比較的次數,每次比較完后判斷兩元素的大小,決定是否需要交換元素。
具體代碼如下: