十種常見排序演算法可以分為兩大類:
穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面。不穩定:如果a原本在b的前面,而a=b,排序之後 a 可能會出現在 b 的後面。
時間複雜度:對排序資料的總的操作次數。反映當n變化時,操作次數呈現什麼規律。氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。空間複雜度:是指演算法在計算機內執行時所需儲存空間的度量,它也是資料規模n的函式。
比較相鄰的元素。如果第乙個比第二個大,就交換它們兩個;
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數;
針對所有的元素重複以上的步驟,除了最後乙個;
重複步驟1~3,直到排序完成。
選擇排序(selection-sort)是一種簡單直觀的排序演算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
選擇排序是表現最穩定的排序演算法之一,因為無論什麼資料進去都是o(n2)的時間複雜度,所以用到它的時候,資料規模越小越好。唯一的好處可能就是不占用額外的記憶體空間了吧。理論上講,選擇排序可能也是平時排序一般人想到的最多的排序方法了吧。
n個記錄的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。具體演算法描述如下:
初始狀態:無序區為r[1..n],有序區為空;
第i趟排序(i=1,2,3…n-1)開始時,當前有序區和無序區分別為r[1..i-1]和r(i..n)。該趟排序從當前無序區中-選出關鍵字最小的記錄 r[k],將它與無序區的第1個記錄r交換,使r[1..i]和r[i+1..n)分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區;
n-1趟結束,陣列有序化了。
插入排序(insertion-sort)的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。
一般來說,插入排序都採用in-place在陣列上實現。具體演算法描述如下:
從第乙個元素開始,該元素可以認為已經被排序;
取出下乙個元素,在已經排序的元素序列中從後向前掃瞄;
如果該元素(已排序)大於新元素,將該元素移到下一位置;
重複步驟3,直到找到已排序的元素小於或者等於新元素的位置;
將新元素插入到該位置後;
重複步驟2~5。
# 若下標為i的元素小於下標為i-1的元素,則將下標為i的元素放到合適位置
if l[i] < l[i - 1]:
tmp = l[i]
j = i - 1
# 尋找a[i]的合適位置,並將a[i-1]至a[i]新位置的元素依次後移
while j >= 0 and tmp < l[j]:
l[j + 1] = l[j]
j = j - 1
# 將a[i]放到新位置
l[j + 1] = tmp
《演算法導論》學習分享 6 堆排序
堆排序也是一種時間複雜度為o n lg n omicron n lg n o nlgn 的排序演算法,但是與歸併排序不同的是堆排序是一種原址排序,也就是說排序過程只是交換資料的位置。堆是乙個陣列,儲存乙個近似完全二叉樹,樹上的每個結點對應陣列中的乙個元素,陣列第乙個元素儲存根節點,第i個元素的左孩子...
幾種排序分享 選擇排序
這裡參考自 狄泰 資料結構課程 這裡講一下選擇排序 基本思想 每次 比如從第 i 次,i 0,1,2,n 2 從後面 n 1 個待排的數中取關鍵字 關鍵字就是指比較的時候需要用來比較的的元素 最小或最大的元素作為有序序列的第 i 個 看個圖 直接上 這裡 分兩部分 乙個是交換元素函式,乙個是真正的排...
幾種排序分享 歸併排序
這裡參考自 狄泰 資料結構課程 基本思想 將兩個或兩個以上的有序序列合併成乙個有序序列 意思就是 v 0 v 1 v 02 v m 和 v m v m 1 v m 2 v n 1 合併 為 v 0 v 1 v 02 v n 1 看下圖 舉例 直接上 template typename t void ...