C語言II博客作業02


這個作業屬於哪個課程 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;
}


免責聲明!

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



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