前端演算法入門 快速排序

2021-09-17 03:30:58 字數 2183 閱讀 2417

以前不寫技術部落格,但寫文章,寫段子,深刻體會過「寫」的妙處。 寫部落格,不止是分享的過程,更不是單純的記錄,它還有個特殊功效,就是產生更多細緻具體的思考。思維在腦海中是完全自由的,但落筆時,它受到約束,你必須讓自己有理有據。所以很多思維上的小漏洞,會在寫出來時暴露,而新的想法,也可能會在落筆的時候促生。這是妙處。

因此,開個小系列,寫技術部落格。這是緣由。

這個小系列,主要練習一些基礎演算法,從排序、查詢開始,中後期會有一些數圖,最短路徑都常見演算法。本人是前端程式設計師,所以目的旨在掌握常見演算法,更多的高能,暫時不打算深入,因為時間有限,還要騰出時間去了解學習前端龐大繁雜的生態。

至於身為前端為什麼搞演算法?

首先基礎演算法掌握一下,是cs畢業生對自己的基本要求。

再者演算法玩起來,會對自己有個提醒,做程式設計師,一定要玩出腦力工作,而不是舒適地保持在體力工作。演算法用作鍛鍊邏輯思維。

再功利一點,面試的時候,會派上用場,多少前端高手折在了手寫二分上面?遺憾。

本系列的**,除了會摘取關鍵部分貼到博文中之外,所有**均會放在乙個倉庫內,託管到github。演算法部分以用typescript進行編寫,正好同時學習ts,用karam + mocha + chai 編寫測試,(現在還沒建好,位址可能是[email protected]:qixman/an-algorithm-a-day)。有興趣的,可以clone下來,也歡迎把意見、建議,以issue形式提出。也歡迎拍磚,雷霆雨露,俱是君恩。

快速排序,它的主要邏輯是,把待排序的序列,以某個元素為基準k(具體是哪個?無所謂,但一般會選擇第乙個元素),將序列分成兩個部分,a部分全部大於這個基準,b部分全部小於這個基準。如果你把a,b部分都作為乙個整體,那麼現在你得到的就是乙個有序序列。a < k < b。

不過暫時還沒結束,因為a,b內部,還沒有得到排序。怎麼辦?對a,b再進行上述操作。

沒錯,這裡就是要用乙個遞迴。

遞迴是乙個非常有趣的概念。我記得在我剛剛學習程式設計時,深深地為這種思維模式的能力吸引,因為相比於一步一步推算公式得出結果,這種方式充滿了智慧型和自動化。

這裡不講遞迴定義, 它大概的樣子,其實就是乙個呼叫它自身的方式,來處理問題。由此可以看出,它非常適合那種在處理資料時,有迴圈邏輯的情況。比如上述的快排,它的迴圈操作就是,不斷將乙個序列,分化成 a < k < b 的模式(如果是降序,則 a > k > b)。而這個迴圈操作就是遞迴的主體部分。

不斷呼叫自身,會陷入死迴圈。因此只有主體是不夠的,遞迴的另乙個部分,就是終止條件,這個很關鍵。還是以快排為例。主體操作是將乙個序列處理成 a < k < b, 但如果接受到的是乙個只有1個元素的序列,或空序列,那麼繼續下去就毫無意義。此時就是遞迴在當前分支終止的最佳時機。請注意,這裡點亮了當前分支,因為遞迴很可能沿著多條路徑遞迴,比如本次快排,子節點會像二叉樹一樣向外發散(這也是遞迴會產生效能問題的原因,時間複雜度會上公升到指數級別)。因此當終止條件結束遞迴的時候,它可能只是終止了當前分支的遞迴,而整體部分,仍在繼續運轉。

這裡對遞迴進行了科普,大家也能發現,在科普遞迴的時候,實際上快速排序的思路,已經很全面的進行了分析。那麼**就比較容易了。

最終**如下:

export default function quicksort(arr: number, isascending: boolean): number  else if (arr[i] > key)  else 

}if (isascending)

return .concat(quicksort(big, isascending), equal, quicksort(small, isascending));

}

測試用例如下

var quicksort = require('../dist/quicksort.js').default;

var assert = require('chai').assert;

describe('quicksort', () => );

it("has only one number", () => );

it("has no number", () => );

it("should repeating number", () => );

});

排序演算法入門 快速排序

涵義 雖說快速排序是由氣泡排序改進而來,二者都是通過元素交換達到排序效果,但是在個人看來快速排序思想和冒泡完全不同。時間複雜度 直接插入排序最好的時間複雜度為o nlog2n 直接插入排序的最壞時間複雜度為o n2 因此直接插入排序總的平均時間複雜度為o nlog2n 注 不穩定 快速排序之所以比冒...

演算法入門(1) 快速排序

下面是用c 寫的 快速排序 的函式 讀出和寫入檔案的函式 常規快速排序的函式 引入隨機基準快速排序的函式 快速排序很簡單,但是還要記錄一下 include include include include include using namespace std 函式區 vector int readf...

前端快速入門 TCP IP

open system interconnection,適用於所有的網路 將複雜的流程分解為幾個功能相對單一的子程序 整個流程更加清晰,複雜問題簡單化 更容易發現問題並針對性的解決問題 表示層 presentation 提供格式化的表示和轉換資料服務,如加密和壓縮 會話層 session 提供包括訪...