這個作業屬於哪個課程 | https://edu.cnblogs.com/campus/zswxy/CST2020-2 |
---|---|
這個作業要求在哪里 | https://edu.cnblogs.com/campus/zswxy/CST2020-2/homework/11810 |
這個作業的目標 | <掌握用一維數組進行編程,掌握選擇排序法和二分查找法> |
學號 | <20208972> |
2.1 完成PTA作業,並給出編程題完成截圖(5分)
2.2 題目:快速尋找滿足條件的兩個數
能否快速找出一個數組中的兩個數字,讓這兩個數字之和等於一個給定的值,為了簡化起見,我們假設這個數組中肯定存在至少一組符合要求的解。
解法一:采用窮舉法,從數組中任意取出兩個數字,計算兩者之和是否為給定的數字。
解法二:對數組中的每個數字arr[i]都判別Sum-arr[i]是否在數組中。
解法三:對數組進行排序,然后使用二分查找法針對arr[i]查找Sum-arr[i]。
要求:
1.根據三種解法給出相應的代碼,並給出測試數據。(15分)
方法一:
方法二:
方法三:
2.請說明三種算法的區別是什么?你還可以給出更好的算法嗎?(10分)
窮舉法優點就是簡單,缺點就是效率低。第二個就是假設給定的和為Sum。一個變通的思路,就是對數組中的每個數字arr[i]都判別Sum-arr[i]是否在數組中,這樣,就變通成為一個查找的算法。二分法效率高。
暫時沒有更好的方法。
2.3 請搜索有哪些排序算法,並用自己的理解對集中排序算法分別進行描述(5分)
1.冒泡排序:(英語:Bubble Sort)是一種簡單的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
2.插入排序:(英語:insertion sort)所謂插入排序法乃是將一個數目插入該占據的位置。
3.選擇排序:(英語:Selection sort)是一種簡單直觀的排序算法。工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。
4.希爾排序:(英語:Shell Sort)希爾排序基本思想:先取一個小於n的整數d1作為第一個增量,把文件的全部記錄分成d1個組。所有距離為d1的倍數的記錄放在同一個組中。先在各組內進行直接插入排序;然后,取第二個增量d2<d1重復上述的分組和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有記錄放在同一組中進行直接插入排序為止。
5.歸並排序:(Merge Sort)歸並排序的根本原理是將一個序列先分成一個一個小序列,分別完成排序,然后再將小序列兩兩合並,直到全部合並完成即排序結束。代碼中也是使用這個思路,先將序列分成(n+1)/2個小序列,再慢慢合並,直到全部合並完成。
6.快速排序:(Quick Sort)快速排序的基本思想:通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
2.4 請給出本周學習總結(15分)
1 學習進度條(5分)
2 累積代碼行和博客字數(5分)
3 學習內容總結和感悟(5分)
1、我對C語言有了一定的了解。C語言是學習計算機科學的基礎,作為一名計算機專業學生,掌握C語言更是毋庸置疑。在上課之前,就經常聽同學說,C語言很難學,確實,剛開始聽課時覺得老師不知所雲。不過,發現對后續內容的預習后,前面的疑團都迎刃而解,這讓我對C語言的學習更有信心。
2、通過課程設計,我發現自己還存在很多知識漏洞,編寫程序時,經常會出現低級錯誤,很多知識點都不熟悉。在今后的時間里,我一定要投入更多精力學習C語言,以課本為基礎,請教老師,與同學討論,參考資料,上機操作,我相信我一定能把C語言學好。
3、不會的一定要問明白,不管誰能讓他教會你知識就是你的了,要學會讓知識為我所用。在看書的時候一定要做好標記,特別是不懂的地方一定要標明是什么意思。
冒泡排序:比較相鄰的元素,如果前一個比后一個大,交換之。第一趟排序第1個和第2個一對,比較與交換,隨后第2個和第3個一對比較交換,這樣直到倒數第2個和最后1個,將最大的數移動到最后一位。第二趟將第二大的數移動至倒數第二位
......
因此需要n-1趟;
#include <stdio.h>
//交換 a 和 b 的位置的函數
#define N 5
int a[N] = { 5,1,4,2,8 };
void swap(int *a, int *b);
//這是帶輸出的冒泡排序實現函數,從輸出結果可以分析冒泡的具體實現流程
void BubSort_test();
//這是不帶輸出的冒泡排序實現函數,通過此函數,可直接對數組 a 中元素進行排序
void BubSort_pro();
int main()
{
BubSort_test();
return 0;
}
void swap(int *a, int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
//這是帶輸出的冒泡排序實現函數,從輸出結果,可以看到冒泡的具體實現流程
void BubSort_test() {
for (int i = 0; i < N; i++) {
//對待排序序列進行冒泡排序
for (int j = 0; j + 1 < N - i; j++) {
//相鄰元素進行比較,當順序不正確時,交換位置
if (a[j] > a[j + 1]) {
swap(&a[j], &a[j + 1]);
}
}
//輸出本輪冒泡排序之后的序列
printf("第%d輪冒泡排序:", i + 1);
for (int i = 0; i < N; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
}
//這是不帶輸出的冒泡排序實現函數,通過此函數,可直接對數組 a 中元素進行排序
void BubSort_pro() {
for (int i = 0; i < N; i++) {
//對待排序序列進行冒泡排序
for (int j = 0; j + 1 < N - i; j++) {
//相鄰元素進行比較,當順序不正確時,交換位置
if (a[j] > a[j + 1]) {
swap(&a[j], &a[j + 1]);
}
}
}
}