所謂排序,即將原本無需的乙個序列重新排列成有序的序列。注意,這個序列中的每一項可能是單獨的資料元素,也可能是一條記錄。
所謂穩定性,是指排序中的序列中有兩個或者兩個以上相同的資料項,排序前後,這些相同的資料項相對位置沒有發生變化,那麼這個排序演算法是穩定的。
下面就幾種常見排序演算法進行總結分析,並會加入一些**分析。
演算法基本思想
有點像咱們打撲克牌的過程,每一趟將乙個待排序的元素作為關鍵字,並按照其關鍵字的大小插入到已經排序好的部分序列的適當位置上,直至完成。
時間複雜度、空間複雜度分析
最好情況是原陣列是已經排序好的,那麼時間複雜度是o(n),最差情況是,全部是逆序,那麼時間複雜度為o(n^2),平均情況是o(n^2)。空間複雜度為o(1)。
void insertionsort(vector
& nums)
nums[j] = tmp;}}
ps:變種,折半插入排序,在直接插入排序的基礎上進行改進,在尋找插入位置的方式上由順序查詢轉變為折半查詢。
演算法基本思想
希爾排序,又稱縮小增量排序,其本質還是插入排序,只不過是將待排序的序列按照某種規則分成幾個子串行,分別對這幾個子串行進行插入排序(在選取增量時,最後乙個增量一定是1,其次增量中的值沒有除了1以外的公因子,例如5,3,1)
時間複雜度、空間複雜度分析
時間複雜度o(nlgn),空間複雜度o(1)
void shellsort(vector
& a)
演算法基本思想維護乙個已經排序的序列,在陣列的末尾。每一次從第乙個元素開始遍歷,直至沒有排序的最後乙個元素為止,每次兩兩元素進行比較,將較大的元素向後通過交換移動,每一次可以將乙個元素下沉到其應有的為止。
時間複雜度、空間複雜度分析
平均時間複雜度o(n^2),最好的情況是,所有元素已經排序好,那麼始終不發生交換,會在內層巢狀中直接退出,此時時間複雜度是o(n)
void swap(vector & nums, int pos1, int pos2)
void bubblesort(vector
& nums)
}if(flag == false)
return;}}
快速排序 桶排序歸併排序 堆排序等會在後續持續更 排序演算法分析
注 都是以增序為例說明!一 氣泡排序 a 原理 從陣列的第乙個位置開始,依次兩兩比較array index 與array index 1 如果array index 大於array index 1 則利用temp交換兩者位置,直到陣列結束。從陣列的第乙個位置開始,重複上面的動作,直至第n 1個位置結...
排序演算法分析 氣泡排序
假設有n個元素,現在要把這些元素按照從小到大的順序進行排序,那麼演算法步驟如下,從第0個元素開始,比較相鄰的兩個元素,第0個和第1個,第1個和第2個,第n 2個和第n 1個,比較範圍是 0,n 1 所有元素都參與比較 如果左邊的比右邊的大,就交換他們的位置,一直比較到最後乙個元素。這樣經過第一輪交換...
排序演算法分析 快速排序
假設有n個元素,現在要把這些元素按照從小到大的順序進行排序,那麼演算法步驟如下,選擇中間位置的元素作為基準值 pivot value 其索引為 0 n 1 2 從第0個元素開始從左往右找到比基準值大的元素,其索引為i從第n 1個元素開始從右往左找到比基準值小的元素,其索引為j交換這兩個元素 從索引i...