常見排序演算法的時空複雜度是什麼?
如圖所示
首先從序列中取乙個數字作為“基線”。
分割槽過程:將所有大於“基線”的數字放在“基線”的右邊,把所有小於或等於“基線”的數字放在“基線”的左邊。
對左間隔和右間隔重複第二步,直到每個間隔只有乙個數字。
var quicksort = function(arr) var pivotindex = math.floor(arr.length / 2);基準位置(理論上任意) var pivot = arrsplice(pivotindex, 1)[0];基準號碼 var left = var right = for (var i = 0; i < arr.length; i++)else }return quicksort(left).concat([pivot], quicksort(right));鏈結左陣列,由基數組成的陣列,右陣列};首先,在未排序的序列中找到最小(最大)元素,並將其儲存在排序序列的開頭。
然後繼續從剩餘的未排序元素中尋找最小(大)元素,然後將其放在排序序列的末尾。
重複第二步,直到所有元素都排序完畢。
function selectionsort(arr) temp = arr[i]; arr[i] = arr[minindex]; arr[minindex] = temp; }return arr;}將要排序的第乙個序列的第乙個元素視為有序序列,將最後乙個元素的第二個元素視為未排序序列。
從頭到尾掃瞄未排序的序列,將掃瞄的每個元素插入到有序序列的適當位置。 (如果要插入的元素等於序列中的某個元素,則要插入的元素將插入到相等的元素之後。 )
function insertionsort(arr) arr[preindex+1] = current; }return arr;}比較相鄰元素。 如果第乙個比第二個大,請交換它們。
對每對相鄰元素執行相同的工作,從第一對開始,到最後一對結束。 完成此步驟後,最後乙個元素將是最大的數字。
對除最後乙個元素之外的所有元素重複上述步驟。
每次重複上述步驟,使元素越來越少,直到沒有數字對進行比較。
function bubblesort(arr) return arr;}1959年,殼體發明,是第乙個突破o(n2)的排序演算法,是簡單插入排序的改進版本。 它與插入排序的不同之處在於,它優先比較距離較遠的元素。 山排序也稱為收縮增量排序。
首先,將整個待排序的記錄序列分成幾個子序列進行直接插入和排序,並描述具體演算法:
選擇增量序列 t1、t2,..., tk, 其中 ti>tj, tk=1;
根據增量序列數 k 對序列進行 k 次排序;
對於每次排序,根據對應的增量ti,將待排序的序列劃分為長度為m的幾個子序列,每個子表直接插入排序。
當增量因子僅為 1 時,將整個序列視為乙個表,表長度為整個序列的長度。
function shellsort(arr) for (gap; gap > 0; gap = math.floor(gap / 3)) arr[j + gap] = temp; }return arr;}直接轉到**。
function mergesort(arr)function merge(left, right) else } //remaining part needs to be addred to the result return result.concat(left.slice(l)).concat(right.slice(r));