第八章主要學習了排序方法。而排序方法中咱們又主要學習內部排序。內部排序的過程是一個逐步擴大記錄的有序序列長度的過程,可分爲插入類、交換類、選擇類、歸併類和分配類。因爲代碼效率的評價指標包括時間效率(比較次數與移動次數)、空間效率及穩定性,因此接下來我要一一記錄下這些排序類的步驟以及從以上三個方面判斷方法的優劣~數組
1、插入類學習
1.基本思想:在R[1....i-1]中查找R[i]的插入位置,R[j]<=R[i]<=R[j+1];spa
在R[j+1....i-1]中全部的記錄後移一個位置;設計
將R[i]插入/複製到R[j+1]的位置上。code
2.直接插入排序(基於順序查找):!從R[i-1]往前查找,不用擔憂越界問題對象
時間複雜度:O(n^2); 空間複雜度:O(1)blog
3.折半插入排序:序列必須有序!排序
2、交換類class
1.基本思想:兩兩比較,若發生逆序則交換,直到全部記錄都排好序 效率
2.冒泡排序:每趟不斷兩兩比較,發生逆序就進行交換(n個數比較n-1趟);當第i趟的排序完畢,就會肯定 第i個大的值
時間複雜度:最好狀況下比較n-1次,不移動;最壞狀況下也比較n-1次,可是要移動3(n-i)(不被選擇的緣由)次;是一種穩定的排序方式
3.快速排序:取任一元素爲中心,將比它小的元素往前移,比它小的日後移,對造成的新子表重複此操做,直至全部記錄的元素都排好序
爲避免選擇元素時發生左右子表數差太多的狀況,咱們能夠對初始值的low、mid、high進行比較取中間值爲中心。
3、選擇類
1.基本思想:每一趟在後面n-i+1箇中選出關鍵碼最小的對象,做爲有序序列的第i個
2.簡單選擇排序:第n-1趟排完,全部樹的順序都排好,必須是數組存儲
時間複雜度爲O(n^2)比較次數一直是n*(n-1)/2,移動次數最好狀況下爲1,最壞狀況3*(n-1),空間複雜度爲O(1)
3.堆排序:n個元素序列{k1,k2,k3....kn}當且僅當知足ki<=k2i&ki<=k2i+1 或者 ki>=k2i&ki>=k2i+1;
時間複雜度:o(n)=nlog_2(n) 樹的深度爲n;是一種不穩定的排序方式;
按非降序來排的時候創建大根堆,非升序排列的時候創建小根堆
能夠解決TopK問題
4、歸併排序
程序代碼:
void Merge (RedType R[], int low, int high, int mid){ RedType *T=new RedType[high+1]; } void MergeSort(SqList &l){ MSort(L, 1,L.ength); }
時間複雜度:O(nlog_2 n); 空間複雜度爲O(N); 可解決「外排序」問題
本章學習的內容比較容易接受,大多數都是前面的學習過程當中設計接觸到的,可是一些重要的排序方法,快速排序、插入排序的過程仍是須要反覆觀看,才能記住。
離考試只剩一星期了,加油!