資料結構:第八章學習小結
一、本章小結
1.根據時間複雜度的不同,常見的演算法可以分為3大類。
1).O(n²)的排序演算法
-
氣泡排序
-
簡單選擇排序
-
插入排序:直接插入,折半插入
2).O(n log n)的排序演算法
- 希爾排序
- 歸併排序
快速排序
-
堆排序
2.根據是否受到待排序物件初始排列影響,可分為
1)受到待排序物件的初始排列:
- 直接插入
- 折半插入(雖然比較次數不受初始排列影響:在插入第i個記錄時,經過(log2i)+1次比較;但移動次數與直接插入相同,受初始排列影響)
- 快速排序(有可能退化到簡單排序,所以平均情況下,時間複雜度為O(nlogn))
- 氣泡排序
- 簡單選擇排序
2)沒有受到待排序物件的初始排列影響:
- 堆排序
- 歸併排序
3.排序的具體操作
1)氣泡排序(Bubble Sort)是一種基礎的交換排序。
氣泡排序之所以叫氣泡排序,是因為它每一種元素都像小氣泡一樣根據自身大小一點一點往陣列的一側移動。
演算法步驟如下:
-
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個;
-
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數;
-
針對所有的元素重複以上的步驟,除了最後一個;
-
持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
2)選擇排序(Selection Sort)
選擇排序(Selection sort)是一種簡單直觀的排序演算法。
選擇排序的主要優點與資料移動有關。
如果某個元素位於正確的最終位置上,則它不會被移動。
選擇排序每次交換一對元素,它們當中至少有一個將被移到其最終位置上,因此對n個元素的表進行排序總共進行至多n - 1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬於非常好的一種。
選擇排序的演算法步驟如下:
-
在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;
-
然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾;
-
以此類推,直到所有元素均排序完畢。
3)插入排序(Insertion Sort)
插入排序(Insertionsort)是一種簡單直觀的排序演算法。
它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。
插入排序的演算法步驟如下:
-
從第一個元素開始,該元素可以認為已經被排序;
-
取出下一個元素,在已經排序的元素序列中從後向前掃描;
-
如果該元素(已排序)大於新元素,將該元素移到下一位置;
-
重複步驟3,直到找到已排序的元素小於或者等於新元素的位置;
-
將新元素插入到該位置後;
-
重複步驟2~5。
4)快速排序(Quick Sort)
快速排序(Quicksort),又稱劃分交換排序(partition-exchange sort)。
快速排序(Quicksort)在平均狀況下,排序n個專案要O(n log n)次比較。在最壞狀況下則需要O(n2)次比較,但這種狀況並不常見。事實上,快速排序O(n log n)通常明顯比其他演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地達成。
快速排序使用分治法(Divide and conquer)策略來把一個序列分為較小和較大的2個子序列,然後遞迴地排序兩個子序列。
快速排序的演算法步驟如下:
-
挑選基準值:從數列中挑出一個元素,稱為“基準”(pivot);
-
分割:重新排序序列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(與基準值相等的數可以到任何一邊)。在這個分割結束之後,對基準值的排序就已經完成;
-
遞迴排序子序列:遞迴地將小於基準值元素的子序列和大於基準值元素的子序列排序。
二、實踐作業心得
在完成第八章作業時,運用了一種新的排序演算法:“投票演算法”。
step1:把輸入的年齡當作陣列下標
int x; int a[10000]; cin>>x;//總數 for(int i=0;i<x;i++) { int m; cin>>m; a[m]++; }
step2:陣列中每個元素的值就是對應的年齡人數,即若a[44]=2,表示44歲的有兩人
for(int i=0;i<51;i++) { if(a[i]!=0) cout<<i<<":"<<a[i]<<endl; }