摘要:由于排序的算法有很多,在本次算法系列的分享當(dāng)中,我們先從簡(jiǎn)單易上手的選擇排序法開(kāi)始,其它的排序算法會(huì)隨后陸續(xù)跟大家一起分享。
算法的基本概念 算法是什么,它有何作用HTML5學(xué)堂-碼匠:數(shù)據(jù)快速的計(jì)算與排序,與前端頁(yè)面性能有直接的關(guān)系。由于排序的算法有很多,在本次“算法系列”的分享當(dāng)中,我們先從簡(jiǎn)單易上手的選擇排序法開(kāi)始,其它的排序算法會(huì)隨后陸續(xù)跟大家一起分享。
為解決一個(gè)問(wèn)題而采取的方法和步驟,稱為算法。
我們可以把算法看成一本“福字剪紙教程”,其中每一種算法就是剪紙教程中的一種包含“固定步驟”的剪紙方法,使用者只要按照步驟進(jìn)行剪紙,就可以剪出好看的福字。
之所以有這么多的算法,在于不同算法解決問(wèn)題的效率各有不同,適合不同的場(chǎng)景。隨著問(wèn)題規(guī)模的增長(zhǎng),算法之間的差距會(huì)變的不可跨越。提升解決問(wèn)題的效率,不僅僅依賴于選擇快速的硬件,還依賴于選擇有效(適合)的算法。
針對(duì)數(shù)組進(jìn)行從大到小(或從小到大)的排序。例如:管理系統(tǒng)中按照成績(jī)的排序,按閱讀量對(duì)文章的排序等。
數(shù)據(jù)快速的計(jì)算與排序,與前端頁(yè)面性能有直接的關(guān)系。(譬如在頁(yè)面中有10000條的數(shù)據(jù)需要靠JS進(jìn)行排序,采用不同的算法所消耗的時(shí)間差距甚大,直接影響著網(wǎng)站的用戶體驗(yàn))
較為常見(jiàn)的排序方法,包括:冒泡排序、選擇排序、快速排序、二分法插入排序等。
由于排序的算法有很多,在本次“算法系列”的分享當(dāng)中,我們先從簡(jiǎn)單易上手的選擇排序法開(kāi)始,其它的排序算法會(huì)隨后陸續(xù)跟大家一起分享。
先找到序列中最小的數(shù),將它和序列中第一個(gè)數(shù)交換位置;
接下來(lái),在剩下的序列中繼續(xù)此操作:找到最小的數(shù),將它和序列中的第二個(gè)數(shù)交換位置;
依此類推,直到將整個(gè)序列排序完成。
簡(jiǎn)言之,選擇排序就是 —— 不斷地選擇剩余序列中的最小者,然后與未排序數(shù)列的“第一個(gè)”數(shù)字交換位置。
排序次數(shù):序列長(zhǎng)度 – 1(注意,不是比較次數(shù));
因?yàn)樾蛄兄械淖詈笠粋€(gè)數(shù)不需要再次比較大小,故排序次數(shù)為 序列長(zhǎng)度 – 1。
序列中找到最小的數(shù),并記錄該數(shù)的索引值;
因?yàn)閙inIndex默認(rèn)開(kāi)始為0,則第一個(gè)數(shù)無(wú)需與自身比較,所以j = i + 1;
// 遍歷序列,找到最小的數(shù) for (var j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { // 記錄最小數(shù)的索引 minIndex = j; }; };
在排序次數(shù)內(nèi)多次遍歷找到最小的數(shù),因此需要再用一個(gè)for語(yǔ)句來(lái)進(jìn)行控制。
// 排序次數(shù) for (var i = 0; i < len - 1; i++) { // 默認(rèn)最小數(shù)的索引為i minIndex = i; // 遍歷序列,找到最小的數(shù) for (var j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { // 記錄最小數(shù)的索引 minIndex = j; }; }; };兩數(shù)交換位置
利用temp變量,實(shí)現(xiàn)兩數(shù)組元素之間數(shù)值的交換,也就是交互位置。
temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp;選擇排序法完整代碼
var arr = [9, 8, 3, 1, 2, 4], len = arr.length, minIndex, temp; // 排序次數(shù) for (var i = 0; i < len - 1; i++) { // 默認(rèn)最小數(shù)的索引為i minIndex = i; // 遍歷剩下的序列,找到最小的數(shù) for (var j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { // 記錄最小數(shù)的索引 minIndex = j; }; }; // HTML5學(xué)堂出品 // 兩數(shù)交互位置 temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; }; console.log(arr);
選擇排序法的效率 算法復(fù)雜度的基本概念歡迎溝通交流~~~HTML5學(xué)堂(碼匠)
算法復(fù)雜度分為時(shí)間復(fù)雜度和空間復(fù)雜度(時(shí)間和空間是計(jì)算機(jī)最重要的資源,因此復(fù)雜度分為時(shí)間和空間)。
時(shí)間復(fù)雜度:指執(zhí)行算法所需要的計(jì)算工作量;
空間復(fù)雜度:指執(zhí)行算法所需要的內(nèi)存空間。
時(shí)間復(fù)雜度是總運(yùn)算次數(shù)表達(dá)式中受n的變化影響最大的項(xiàng)(不含系數(shù));
第一次循環(huán)比較n-1次,然后是n-2次,n-3次,依此類推,最后一次循環(huán)比較1次,總的比較次數(shù)和為(n - 1 + 1) * n / 2,即進(jìn)行比較操作的時(shí)間復(fù)雜度為O(n^2)
Tips:選擇排序的比較次數(shù)與序列的初始排序無(wú)關(guān)。
排序算法需要一個(gè)額外的空間(temp變量)來(lái)交換元素的位置。
不穩(wěn)定排序的一種算法選擇排序是一種不穩(wěn)定排序的算法。
比如:序列[3, 8, 3, 1, 9 ],第一次循環(huán)第1個(gè)元素3會(huì)和1交換,變成[1, 8, 3, 3, 9],此時(shí),原序列中兩個(gè)3的先后順序被破壞。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/84818.html
摘要:今天跟大家分享多種排序算法里使用較廣泛,速度快的排序算法快速排序法平均時(shí)間復(fù)雜度為。快速排序法的原理快速排序是一種劃分交換排序,它采用分治的策略,通常稱其為分治法。 HTML5學(xué)堂-碼匠:前幾期算法之旅跟大家分享了冒泡排序法和選擇排序法,它們都屬于時(shí)間復(fù)雜度為O(n^2)的慢排序。今天跟大家分享多種排序算法里使用較廣泛,速度快的排序算法—— 快速排序法 [ 平均時(shí)間復(fù)雜度為O (n l...
摘要:學(xué)堂碼匠本期繼續(xù)走入算法冒泡排序法。冒泡排序法完整代碼冒泡排序法的優(yōu)化假如序列的數(shù)據(jù)為使用上面的冒泡排序法進(jìn)行排序,得到的結(jié)果肯定沒(méi)有問(wèn)題,但是,待排序的序列是有序的,理論上是無(wú)需遍歷排序。 HTML5學(xué)堂-碼匠:本期繼續(xù)走入算法 —— 冒泡排序法。冒泡排序算法相對(duì)簡(jiǎn)單,容易上手,穩(wěn)定性也比較高,算是一種較好理解的算法,也是面試官高頻提問(wèn)的算法之一。 Tips:關(guān)于算法及排序的基礎(chǔ)知識(shí)...
閱讀 1493·2023-04-25 15:40
閱讀 2871·2021-08-11 11:15
閱讀 2282·2019-08-26 13:48
閱讀 2855·2019-08-26 12:18
閱讀 2457·2019-08-23 18:23
閱讀 2913·2019-08-23 17:01
閱讀 2987·2019-08-23 16:29
閱讀 1107·2019-08-23 15:15