動畫:面試官問我插入排序和冒泡排序哪個更牛逼?

2021-02-20 算法與數據結構

排序對於每個開發者來講,都多多少少知道幾個經典的排序算法,比如我們之前以動畫形式分享的冒泡排序,也包括今天要分享的插入排序。還有一些其他經典的排序,小鹿整理的共有十種是面試常問到的,冒泡排序、插入排序、希爾排序、選擇排序、歸併排序、快速排序、堆排序、桶排序、計數排序、基數排序。

雖然我們基本知道了這些排序算法,但是在實際項目開發以及面試中往往出乎我們所料。在面試中,經常會被問到各種排序之間的比較;在實際項目中,往往排序的數據不是我們所練習的整數。

那麼今天我們來學習一下,插入排序比我們之前講的冒泡排序有什麼區別呢?面試官問我們,我們如何回答完整呢?

分析排序算法已經成為我們衡量一個算法優良的重要標準,從以下三個方面入手。

1.1 時間效率

這裡所謂的實踐效率就是時間複雜度,相信大家對於時間複雜度並不陌生。

複雜度描述的是算法執行時間(或佔用空間)與數據規模的增長關係。

對於時間複雜度的分析,要把最好時間複雜度、最壞時間複雜度、平均時間複雜度分析出來,分別對應了排序算法的最好排序情況、最壞排序情況以及平均排序效率。

1.2 空間消耗

所謂的空間消耗對應的是空間複雜度,在排序算法中需要開闢的額外內存空間是多少。如果空間複雜度為 O(1),此時該排序叫做原地排序。

注意:是額外的內存空間,存儲排序數據消耗的空間不計。

算法的穩定性雖然我們之前接觸的很少,但是穩定性也是衡量一個排序算法的重要標準。什麼是穩定排序呢?比如有一組有重複待排序的數據,排序前後,重複的數據順序不變,此時該排序為穩定排序。否則,叫做不穩定排序。它在實際應用中非常重要的,今天我們就不多說,以後會慢慢分享到。

顧名思義,插入排序就是通過插入的方式來排序唄,最經典的就是打鬥地主,可以將打亂的撲克牌作為未排序區間,手中已經排好序的作為排序區間。每次我們摸牌的過程,就是從未排序區間,通過插入的方式,插入到已排序區間。那麼這個過程就稱為插入排序。

上述插入排序的概念我們已經理解了,那麼給你一組數據,如何來進行插入排序呢?

首先我們要將數據劃分為兩個區間,已排序區間和未排序區間。

我們從未排序區間取出數據和已排序區間的數據進行比較,如果小於已排序區間的數據,那我們就交換數據。

如果交換到已排序區間數據不在大於插入的數據,然後將元素插入進去。

我們通過上邊的對插入排序的拆分講解和動畫以及代碼實現,想必面試官讓你手寫一個插入排序可以輕輕鬆鬆寫出。但是我們掌握的插入排序知識還往往不夠,我們在實際項目中,還要考慮插入排序的性能怎麼樣?因為才能更好的選擇適當排序應用到項目中去。

4.1 插入排序的穩定性

再插入排序中,如果存在重複數據的話,前邊的元素再插入的過程永遠在第二個重複數據的前邊,所以插入排序後的重複數據前後順序不變,所以插入排序是穩定排序算法。

4.2 插入排序的空間消耗

我們可以發現,插入排序的移動方式,需要消耗常量級的額外內存空間存儲,也就是代碼中的 temp,所以時間複雜度為 O(1),我們上邊講到,空間複雜度為O(1)的是原地排序算法。

4.3 插入排序的時間效率


插入排序的最好情況就是不需要搬移任何數據,從頭到尾尋找插入數據,每次只比較一次即可,即一組有序數據,所以最好時間複雜度為O(n)。

如果一組數據正好是倒序輸出,那麼每次都需要比較移動所有數據,每次移動時 n,n 個數據時間複雜度為O(n²)。

對於插入排序的平均時間複雜度,每次插入都要移動數據,插入 n 次,所以平均時間複雜度為 O(n²)。

我們學完了今天的插入排序之後,我們回到最初的面試官問題上。插入排序和冒泡排序哪個更好呢?

我們現在元素移動次數上進行分析,如果一組無序的數據通過冒泡排序排好序之後,它的交換次數是這種數據的逆序度;對於插入排序來說也是一樣的,移動次數上都是原本數據的逆序度。

元素的移動次數是相同的,那我們接下來看看元素的交換次數。從代碼上分析可以明顯看出,冒泡排序的一次交換需要三行代碼,而插入排序的交換卻需要一行,所以總的交換次數冒泡排序大於插入排序。

有小夥伴會問,這兩行的差別有那麼大嗎?移動一次,我們可以不計較,如果數據很多,想想下,兩者的效率差別很輕易的就比較出來了。

雖然冒泡排序的時間複雜度和插入排序的時間複雜度是相同的,但是我們實際使用中還是優先選擇插入排序。

對於插入排序還是可以優化的,對了,沒錯,就是希爾排序,我們在這不多分開寫,後期會繼續更新。

如果覺得寫的有幫助,歡迎轉發朋友圈圈哦!

●編號1064,輸入編號直達本文

●輸入m獲取文章目錄

程式設計師數學學習

鍛鍊數學邏輯思維

相關焦點

  • 面試官問我插入排序和冒泡排序哪個更牛逼?
    ,比如我們之前以動畫形式分享的冒泡排序,也包括今天要分享的插入排序。還有一些其他經典的排序,小鹿整理的共有十種是面試常問到的,冒泡排序、插入排序、希爾排序、選擇排序、歸併排序、快速排序、堆排序、桶排序、計數排序、基數排序。雖然我們基本知道了這些排序算法,但是在實際項目開發以及面試中往往出乎我們所料。在面試中,經常會被問到各種排序之間的比較;在實際項目中,往往排序的數據不是我們所練習的整數。
  • 筆試題:編寫插入排序代碼,比冒泡排序還簡單(附代碼)
    最近有同事跳槽某大企業(「**在手,說走就走」),竟然被問到簡單的排序算法,不過不是大家耳熟能詳的冒泡排序,而是插入排序。本文將詳細說明插入排序算法的原理與具體實現代碼,以供大家參考、學習。插入排序插入排序的原理這裡就不用文字來描述原理了,直接以圖例為大家解釋:簡單的說就是把下一位數和前面的N-1個數逐一比較,如果比前面的小,就互換位置,然後再把N-1位和其前面的N-2個數逐一比較
  • 各種選擇+冒泡+插入排序圖解
    排序基礎算法之一,屬於常見題型。下面說明一下常見的排序算法,看上哪個就用吧!
  • 看動畫學算法之:排序-冒泡排序
    簡介排序可能是所有的算法中最最基礎和最最常用的了。排序是一個非常經典的問題,它以一定的順序對一個數組(或一個列表)中的項進行重新排序。排序算法有很多種,每個都有其自身的優點和局限性。今天我們來學習最最簡單的冒泡排序算法。冒泡排序的原理冒泡排序的原理很簡單,我們想像一下一個一個的氣泡上浮的過程。
  • 面試官:手寫一個冒泡排序,並對其改進
    前寫過一篇選擇排序,很多人把它和冒泡排序搞混了,這篇文章對冒泡排序進行一個分析,希望你能分清楚,也希望能在面試的時候能夠完美的回答出冒泡排序。今年的工作據說是不好找,當然運氣佔很大一部分,但是實力越強運氣的成分就會相應降低吧。
  • Python中的插入排序算法,插入排序的優缺點,中級python技術點
    像冒泡排序一樣,插入排序算法也易於實現和理解。但是與冒泡排序不同,它通過將每個項目與列表的其餘部分進行比較並將其插入正確的位置,來一次構建一個列表。此「插入」過程為算法命名。一個很好的類比來解釋插入排序是您對一副紙牌進行排序的方式。想像一下,您手裡拿著一組卡片,並且想要按順序排列它們。首先,將一張卡片與其餘卡片進行逐步比較,直到找到正確的位置為止。
  • JavaScript面經之冒泡排序
    文/大白老師圖/大白老師我們去大廠面試前端的時候,最容易被問及的一個內容就是排序,而其中,冒泡排序作為最基礎的排序算法,很多時候是被要求進行手寫代碼的,面試官通過對手寫代碼的考察,可以看出求職者的算法基礎功底、JavaScript語言功底以及在開發時,對變量的語義化水平
  • Java實現冒泡排序算法
    有人說,數據結構與算法,計算機網絡,與作業系統都一樣,脫離日常開發,除了面試這輩子可能都用不到呀!有人說,我是做業務開發的,只要熟練API,熟練框架,熟練各種中間件,寫的代碼不也能「飛」起來嗎?於是問題來了:為什麼還要學習數據結構與算法呢?
  • 重溫7種排序算法 第一篇,交換排序算法:冒泡排序、快速排序
    排序算法可分為以下幾類:    交換排序算法:冒泡排序、快速排序;    選擇排序算法:簡單選擇排序、堆排序;    插入排序算法:直接插入排序、希爾排序;    歸併排序算法。    主要做了以上7種排序算法的筆記,字數可能較多,所以分為幾篇。
  • 排序算法之插入排序
    如果公眾號文章對您有幫助,別忘了點擊分享和「在看」哦!若您對公眾號有什麼意見或建議,請在公眾號中回復或在任意文章底部留言!排序算法在編程領域中起著舉足輕重的作用,在目標檢索、機器學習、數值計算、圖像處理等領域有著廣泛地應用。為了追本溯源,公眾號特推出常用經典排序算法系列推文,讓小夥伴們深入了解排序算法的實現原理,同時也提升matlab編程能力。
  • 算法系列: 10大常見排序算法(3)插入排序
    插入排序最好的示例是撲克牌,很多書都以抓撲克牌的過程為例子講述插入的排序過程。現在你需要將手牌從左到右按小到大排序。和選擇排序法的比較插入排序法和選擇排序法接近。在選擇排序法中,經過k次掃描(整個)數組,最初的k個元素完成排序。
  • 動畫詳解常用排序算法(1)
    剛學編程時大家都愛用冒泡排序,隨後接觸到選擇排序、插入排序等,歷史上還有曇花一現的希爾排序,公司面試時也經常會問到快速排序等等,小小的排序算法,融入了無數程序大牛的心血。如牛頓所言,正是站在巨人的肩膀上,我們才能望得更遠。本文我們就來一起梳理一下排序算法的前世今生。
  • ...選擇,插入,希爾,歸併,快排,堆排序,計數排序,桶排序,基數排序)
    一、前言傳統的計算機算法和數據結構領域,都是基於java或者c/c++等。沒用javascript實現過或是沒仔細看過相關算法的原理,導致寫起來浪費很多時間。對於一個前端來說,尤其是筆試面試的時候,算法方面考的其實不難(十大排序算法或是和十大排序算法同等難度的)。
  • 算法一看就懂之「 插入排序 」
    冒泡排序 」了,今天咱們來看一看「 插入排序 」。「 插入排序 」與「 冒泡排序 」一樣都屬於時間複雜O(n*n)的排序算法,並且也都是基於元素之間比較的方式來完成排序的。不過「 插入排序 」比「 冒泡排序 」在實際應用中更廣泛一些,因為它的執行效率更高一點。一、「 插入排序 」是什麼?
  • Python實現經典排序算法,再也不怕面試官讓我手寫快排了!
    因此,一般對大型數組進行排序的時候,不會考慮使用冒泡排序。Python中的插入排序算法像冒泡排序一樣,插入排序算法也易於實現和理解。但是與冒泡排序不同,它通過將每個元素與列表的其餘元素進行比較並將其插入正確的位置,來一次構建一個排序的列表元素。此「插入」過程為算法命名。
  • Java中常見的排序算法有哪些?---冒泡排序
    每個數據表用哪個屬性域作為排序碼,要視具體的應用需要而定。我們常見的一些排序算法,如圖所示: 交換排序交換排序的基本思想是:兩兩比較待排序記錄(數據表)的關鍵字(排序碼),發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。主要包括冒泡排序和快速排序。
  • 五十五、深入插入排序和選擇排序
    因此,代碼編寫需要判斷插入元素和當前元素的大小關係,遍歷時需要從數組的第二個數開始。如果插入元素大於當前元素,則將待插入元素插入到當前元素的後一位。如果插入元素小於當前元素,則將當前元素後移一位。直到找到一個當前元素小於插入元素。因此,在for循環遍歷時,又有一個while內循環的條件,條件的內容是插入元素的索引減一和零進行對比。如果插入元素小於當前元素,同時對索引進行減一操作。如果出現了索引等於零的情況,那麼表示插入元素等於當前元素。下面是插入排序的具體Python代碼。
  • 單集合排序:冒泡排序法
    在日常開發中經常會遇到一類問題,就是對一個集合的數據進行排序掌握一些排序算法,對於日常開發是非常有幫助今天介紹一下冒泡排序法01算法邏輯>02時間複雜度由上圖邏輯可以得出,冒泡排序的循環次數為由循環次數可以得出,冒泡排序的時間複雜度為03空間複雜度由上圖邏輯可以得出
  • 你所知道的十大排序算法的總結(冒泡,選擇,插入,希爾,歸併,快排,堆...
    一、前言傳統的計算機算法和數據結構領域,都是基於java或者c/c++等。沒用javascript實現過或是沒仔細看過相關算法的原理,導致寫起來浪費很多時間。對於一個前端來說,尤其是筆試面試的時候,算法方面考的其實不難(十大排序算法或是和十大排序算法同等難度的)。
  • 排序算法問題:穩定排序與不穩定排序
    作為在面試中經常被考到的考點,每一個程式設計師都應該知道,本文總結了常見算法的穩定性,值得一看,希望能對大家有所幫助。正文這幾天筆試了好幾次了,連續碰到一個關於常見排序算法穩定性判別的問題,往往還是多選,對於我以及和我一樣拿不準的同學可不是一個能輕易下結論的題目,當然如果你筆試之前已經記住了數據結構書上哪些是穩定的,哪些不是穩定的,做起來應該可以輕鬆搞定。本文是針對老是記不住這個或者想真正明白到底為什麼是穩定或者不穩定的人準備的。