這個作業屬於哪個課程 | https://edu.cnblogs.com/campus/zswxy/CST2020-2/ |
---|---|
這個作業要求在哪里 | https://edu.cnblogs.com/campus/zswxy/CST2020-2/homework/11810 |
這個作業的目標 | 學習了解數組,掌握用一維數組進行編程,選擇排序法和二分查找法 |
學號 | 20208988 |
2.1 完成PTA作業,並給出編程題完成截圖(5分)
7-1 年齡與疾病 (10 分)
7-2 選擇排序法 (100 分)
2.2 題目:快速尋找滿足條件的兩個數
能否快速找出一個數組中的兩個數字,讓這兩個數字之和等於一個給定的值,為了簡化起見,我們假設這個數組中肯定存在至少一組符合要求的解。
解法一:采用窮舉法,從數組中任意取出兩個數字,計算兩者之和是否為給定的數字。
解法二:對數組中的每個數字arr[i]都判別Sum-arr[i]是否在數組中。
解法三:對數組進行排序,然后使用二分查找法針對arr[i]查找Sum-arr[i]。
要求:
1.根據三種解法給出相應的代碼,並給出測試數據。(15分)
解法一:
測試數據 | 輸入 | 輸出 |
---|---|---|
0 1 2 3 4 5 6 7 8 9 | 15 | 6 9 ,7 8 |
0 1 2 3 4 5 6 7 8 9 | 14 | 5 9, 6 8 |
解法二:
測試數據 | 輸入 | 輸出 |
---|---|---|
9 8 7 6 5 4 3 2 1 0 | 12 | 0 6 ,1 5,2 4 |
9 8 7 6 5 4 3 2 1 0 | 14 | 0 4, 1 3 |
解法三:
測試數據 | 輸入 | 輸出 |
---|---|---|
0 2 4 6 8 1 3 5 7 9 | 12 | 3 9,4 8, 5 7,... |
0 1 2 3 4 5 6 7 8 9 | 14 | 5 9, 6 8,.. |
2.請說明三種算法的區別是什么?你還可以給出更好的算法嗎?(10分)
區別:前兩種算法都需要多次遍歷數組,時間復雜度高於第三種算法,第三種算法每次去掉一半的查找元素,大大的減少了時間復雜度。
暫時沒有更好的算法減少時間復雜度。
2.3 請搜索有哪些排序算法,並用自己的理解對集中排序算法分別進行描述(5分)
1.冒泡排序(Bubble Sort) 是一種簡單的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
2.選擇排序 (Selection-sort)是一種簡單直觀的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
3.插入排序(Insertion-Sort)的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從后向前掃描,找到相應位置並插入。
4.希爾排序 (Shell Sort)第一個突破O(n2)的排序算法,是簡單插入排序的改進版。它與插入排序的不同之處在於,它會優先比較距離較遠的元素。希爾排序又叫縮小增量排序。
5.歸並排序(Merge Sort)是建立在歸並操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合並,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合並成一個有序表,稱為2-路歸並。
6.快速排序(Quick Sort)的基本思想:通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
。。。
十大經典算法
2.4 請給出本周學習總結(15分)
1 學習進度條(5分)
2 累積代碼行和博客字數(5分)
3 學習內容總結和感悟(5分)
1.實踐是融會貫通的必要基礎。
2.自學深度不夠,未能發散思維,數據結構和算法沒學到精髓。
3.學習他人優秀代碼是學習C語言的一個不錯的方法。
4.多閱讀經典書籍是個不錯的增長見識的選擇。
冒泡排序的實質是,數組相鄰元素兩兩比較,若不符合要排序順序。則交換兩個元素,每一次遍歷數組都讓一個元素到它該出現的位置,這個過程稱為冒泡,n個元素最多n-1趟冒泡即可將所有元素排成所需順序。演示圖如下:
#include<stdio.h>
int main()//冒泡排序
{
int arr[10] = { 1 ,3,5,7,9,2,4,6,8,0 };//假設arr為要排序的數組,排成升序
int i = 0;
int j = 0;
int flag = 0;//是否已滿足順序的標志
int sz = sizeof(arr) / sizeof(arr[0]);//計算數組元素個數
for (i = 0; i < sz; i++)//排序開始
{
for (j = 0; j < sz - 1 - i; j++)//sz-1防止越界,-i減少時間復雜度
{
if (arr[j] > arr[j + 1])//不滿足順序則交換
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 1;
}
}
if (0 == flag)//未發生交換則說明已排好序,跳出循環
break;
}//排序結束
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);//輸出排序后的數組
}
return 0;
}