面試高頻算法精簡總結

排序

1、排序方法與複雜度歸類
(1)幾種最經典、最經常使用的排序方法:冒泡排序、插入排序、選擇排序、快速排序、歸併排序、計數排序、基數排序、桶排序。
(2)複雜度歸類
冒泡排序、插入排序、選擇排序 O(n^2)
快速排序、歸併排序 O(nlogn)
計數排序、基數排序、桶排序 O(n)算法

2、如何分析一個「排序算法」?
<1>算法的執行效率數組

  1. 最好、最壞、平均狀況時間複雜度。
  2. 時間複雜度的係數、常數和低階。
  3. 比較次數,交換(或移動)次數。

<2>排序算法的穩定性code

  1. 穩定性概念:若是待排序的序列中存在值相等的元素,通過排序以後,相等元素之間原有的前後順序不變。
  2. 穩定性重要性:可針對對象的多種屬性進行有優先級的排序。
  3. 舉例:給電商交易系統中的「訂單」排序,按照金額大小對訂單數據排序,對於相同金額的訂單如下單時間遲早排序。用穩定排序算法可簡潔地解決。先按照下單時間給訂單排序,排序完成後用穩定排序算法按照訂單金額從新排序。

<3>排序算法的內存損耗
原地排序算法:特指空間複雜度是O(1)的排序算法。對象

3、冒泡排序排序

冒泡排序只會操做相鄰的兩個數據。每次冒泡操做都會對相鄰的兩個元素進行比較,看是否知足大小關係要求,若是不知足就讓它倆互換。

穩定性:冒泡排序是穩定的排序算法。
空間複雜度:冒泡排序是原地排序算法。
時間複雜度:內存

  1. 最好狀況(滿有序度):O(n)。
  2. 最壞狀況(滿逆序度):O(n^2)。
  3. 平均狀況:
    「有序度」和「逆序度」:對於一個不徹底有序的數組,如4,5,6,3,2,1,有序元素對爲3個(4,5),(4,6),(5,6),有序度爲3,逆序度爲12;對於一個徹底有序的數組,如1,2,3,4,5,6,有序度就是n*(n-1)/2,也就是15,稱做滿有序度;逆序度=滿有序度-有序度;冒泡排序、插入排序交換(或移動)次數=逆序度。
    最好狀況下初始有序度爲n(n-1)/2,最壞狀況下初始有序度爲0,則平均初始有序度爲n(n-1)/4,即交換次數爲n*(n-1)/4,因交換次數<比較次數<最壞狀況時間複雜度,因此平均時間複雜度爲O(n^2)。

4、插入排序開發

插入排序將數組數據分紅已排序區間和未排序區間。初始已排序區間只有一個元素,即數組第一個元素。在未排序區間取出一個元素插入到已排序區間的合適位置,直到未排序區間爲空。

空間複雜度:插入排序是原地排序算法。
時間複雜度:電商

  1. 最好狀況:O(n)。
  2. 最壞狀況:O(n^2)。
  3. 平均狀況:O(n^2)(往數組中插入一個數的平均時間複雜度是O(n),一共重複n次)。

穩定性:插入排序是穩定的排序算法。效率

5、選擇排序軟件

選擇排序將數組分紅已排序區間和未排序區間。初始已排序區間爲空。每次從未排序區間中選出最小的元素插入已排序區間的末尾,直到未排序區間爲空。

空間複雜度:選擇排序是原地排序算法。
時間複雜度:(都是O(n^2))

  1. 最好狀況:O(n^2)。
  2. 最壞狀況:O(n^2)。
  3. 平均狀況:O(n^2)。

穩定性:選擇排序不是穩定的排序算法。

思考

選擇排序和插入排序的時間複雜度相同,都是O(n^2),在實際的軟件開發中,爲何咱們更傾向於使用插入排序而不是冒泡排序算法呢?
   答:從代碼實現上來看,冒泡排序的數據交換要比插入排序的數據移動要複雜,冒泡排序須要3個賦值操做,而插入排序只須要1個,因此在對相同數組進行排序時,冒泡排序的運行時間理論上要長於插入排序。
相關文章
相關標籤/搜索