面試準備 排序演算法歸納

2021-09-11 23:54:58 字數 2237 閱讀 1872

要點:迴圈,比較相鄰的元素,如果第乙個比第二個大,就交換他們,依次找到最大值,使其排在最後。

選擇排序改進了氣泡排序,每次遍歷列表只做一次交換。

乙個選擇排序在他遍歷時尋找最大的值,並在完成遍歷後,將其放置在正確的位置。與氣泡排序一樣,在第一次遍歷後,最大的項在正確的地方。 第二遍後,下乙個最大的就位。遍歷 n-1 次排序 n 個項,因為最終項必須在第(n-1)次遍歷之後。

它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。

類似打撲克牌抓牌

優化1:折半插入——改進了第1步:從已經排好序的陣列中找到該插入的點。

取已經排好序的陣列的中間元素,與插入的資料進行比較,如果比插入的資料大,那麼插入的資料肯定屬於前半部分,否則屬於後半部分。這樣,不斷遍歷縮小範圍,很快就能確定需要插入的位置。這就是所謂「折半」。

希爾排序是基於插入排序的以下兩點性質而提出改進方法的:

插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到線性排序的效率;

但插入排序一般來說是低效的,因為插入排序每次只能將資料移動一位;

希爾排序的基本思想是:先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行依次直接插入排序。

演算法步驟

選擇乙個增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;(如2^k-1:1,3,7,15等)

按增量序列個數 k,對序列進行 k 趟排序;

每趟排序,根據對應的增量 ti,將待排序列分割成若干長度為 m 的子串行,分別對各子表進行直接插入排序。僅增量因子為 1 時,整個序列作為乙個表來處理,表長度即為整個序列的長度。

分治法演算法步驟

申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列;

設定兩個指標,最初位置分別為兩個已經排序序列的起始位置;

比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置;

重複步驟 3 直到某一指標達到序列尾;

將另一串行剩下的所有元素直接複製到合併序列尾。

遞迴法更簡單

快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。

快速排序又是一種分而治之思想在排序演算法上的典型應用。本質上來看,快速排序應該算是在氣泡排序基礎上的遞迴分治法。

從數列中挑出乙個元素,稱為 「基準」(pivot),重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

快速排序的最壞運**況是 o(n²),比如說順序數列的快排。但它的平攤期望時間是 o(nlogn),且 o(nlogn) 記號中隱含的常數因子很小,比複雜度穩定等於 o(nlogn) 的歸併排序要小很多。所以,對絕大多數順序性較弱的隨機數列而言,快速排序總是優於歸併排序。

優化:隨機快排

堆排序(heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法:

大頂堆:每個節點的值都大於或等於其子節點的值,在堆排序演算法中用於公升序排列;

小頂堆:每個節點的值都小於或等於其子節點的值,在堆排序演算法中用於降序排列;

堆排序的平均時間複雜度為 ο(nlogn)。

計數排序的核心在於將輸入的資料值轉化為鍵儲存在額外開闢的陣列空間中。作為一種線性時間複雜度的排序,計數排序要求輸入的資料必須是有確定範圍的整數。

桶排序是計數排序的公升級版。它利用了函式的對映關係,高效與否的關鍵就在於這個對映函式的確定。為了使桶排序更加高效,我們需要做到這兩點:

在額外空間充足的情況下,盡量增大桶的數量

使用的對映函式能夠將輸入的 n 個資料均勻的分配到 k 個桶中

同時,對於桶中元素的排序,選擇何種比較排序演算法對於效能的影響至關重要。

基數排序可以看做是進行多趟桶排序。

基數排序是一種非比較型整數排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。由於整數也可以表達字串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是只能使用於整數。

面試準備 排序演算法

氣泡排序 從陣列中的第乙個元素開始到最後乙個元素,將相鄰兩個元素進行比較,若陣列左端的元素大於陣列有短的元素,則交換兩元素的位置,然後再對該陣列剩下的元素進行氣泡排序 氣泡排序 void bubblesort int arr,int length 選擇排序 首先在未排序陣列中找到最小的資料,將其放在...

準備演算法面試

我決定寫篇短文,即為此文。之所以要寫這篇文章,緣於微博上常有朋友詢問,要畢業找工作了,如何備戰演算法。儘管在微博上簡單梳理過,如下圖所示 但因字數限制,許多問題無法一次性說清楚,故特撰此文著重闡述下 程式設計師如何快速準備面試中的演算法,繼而推薦一些相關的書籍或資料。順便也供節後跳槽 3月春季招聘小...

排序演算法 歸納總結

一 直接插入排序 氣泡排序和簡單選擇排序是最基本的排序方法,它們主要用於元素個數n n 10000 不是很大的情形。它們的平均複雜度均為o n 2 實現也比較簡單。1 直接插入排序對於規模很小的元素序列 n 25 非常有效。它的時間複雜度與待排序元素序列的初始排列有關。在最好情況下,直接插入排序只需...