演算法導論第二章筆記

2021-07-17 01:16:00 字數 1558 閱讀 3585

這一章首先以乙個插入排序演算法開始,以此為切入點分析演算法。書上以偽**來介紹演算法,但是在這裡我基本上會用c語言實現一遍,並用自己的語言複述一遍演算法的思想。

首先附上插入排序的具體實現。

void insert_sort (eletype *arr , int start , int end) 

arr[j+1] = temp;}}

重要思路:運用迴圈不變式的思想,第一次迴圈開始,我們不必對只含有乙個元素的陣列進行排序,因為其本身就是排序好的。接下來是保持,我們首先用temp變數儲存arr[i],這個是要插入元素,在已經排好序的陣列查詢大於temp的元素,並把它向後移動。最後是終止,將i = end帶入迴圈不變式,我們可以看見,最後乙個元素插入到之前已經排好序的陣列當中,所以這個演算法是正確的。

對插入排序的分析,由於演算法的時間主要是集中在迴圈上面,所以我們集中精力看迴圈就可以,當出現最好的情況的時候,arr陣列已經排好序了,那麼時間複雜度是n,當出現最壞的情況的時候,時間複雜度是n的平方。(這裡就不在贅述書上的過程了,很簡單)。

下面作者設計了乙個分治的排序演算法——歸併排序演算法。先附上c語言的實現。

void merge (eletype *arr , int start , int mid , int end) else 

}if (n1 == (mid - start + 1))

}else if (n2 == (end - mid))

}for (i = start ; i <= end ; i++)

arr[i] = temp[i-start];

}void merge_sort (eletype *arr , int start , int end)

/*for (i = start ; i <= end ; i++)

printf ("%d " , arr[i]);

printf ("\n");

printf ("start = %d , end = %d , mid = %d\n" , start , end , mid);

printf ("\n");*/

}

重要思路:首先設計歸併演算法,將兩個已經排好序的子陣列合併成乙個排好序的陣列。書上在設計這個演算法的時候使用了哨兵值,但是在這裡我變通了一下,判斷其中乙個子陣列是否已經空了,如果空了,就跳出迴圈,直接把另外乙個子陣列中的剩下的值,轉移到乙個陣列當中。再使用遞迴演算法排序。因為乙個子陣列中如果只有乙個元素的話,那麼這個子陣列其實就是排好序的。利用這個性質作為遞迴的出口,設計出遞迴演算法。

演算法分析:這裡書上介紹了遞迴表示式,利用遞迴表示式,使用以後學習的知識(主方法)可以方便的求出,這個遞迴演算法的時間複雜度。這裡我們觀察merge這個函式的複雜度為n。我們在這裡可以看到,歸併演算法把整個演算法分治為兩個部分,每個部分可以處理二分之一的規模(這裡規模定義為陣列的大小)

上圖就是遞迴表示式。

我們如果使用書上畫圖的方法可以求出這個表示式的時間複雜度為n*lgn。

演算法導論第二章

插入排序原始碼 1 include 2 include 3 4using namespace std 56 void insert sort inta 7 17 a i 1 key 18 19 2021 intmain 22view code 逆序輸出 1 include 2 include 3 4...

演算法導論 第二章作業

作業2.1 2 template void insert t a,int n a i 1 key 2.1 3 template void find t a,int n,t v if i 1 v nil 迴圈不變式 初始化 i 1,v還沒和任何a陣列中的元素比較,所以是 1,它為真。保持 如果j迴圈到...

演算法導論筆記 第二章 演算法基礎(上)

學習 演算法導論 第三版 機械工業出版社 分享一些個人所得以及記錄一些筆記,若有錯誤還請不吝指正,謝謝!本章節通過分析插入排序,引入 演算法導論 中設計和分析演算法的乙個框架 分上下兩篇博文,一天一篇比較輕鬆 插入排序 通常適用於少量元素的排序,大體上為將乙個混亂無序的陣列序列或其他序列,每一次將乙...