摘要:如果有錯(cuò)誤或不嚴(yán)謹(jǐn)?shù)牡胤剑瑲g迎批評(píng)指正,如果喜歡,歡迎點(diǎn)贊收藏
算法對(duì)大多數(shù)前端工程師來說都是一個(gè)比較不愿意提及的話題,因?yàn)閷W(xué)了,感覺在工作中直接應(yīng)用的場(chǎng)景不多,不學(xué),大廠面試必考算法,總結(jié)來說就是:沒有學(xué)習(xí)算法的源動(dòng)力,為面試學(xué)習(xí)算法總不會(huì)令人動(dòng)力去學(xué)習(xí),沒有動(dòng)力想要學(xué)好算法自然也很難,對(duì)我來說,學(xué)習(xí)算法的動(dòng)力就是希望寫出更高效率的代碼,更好的理解各種前端框架的設(shè)計(jì)思路,因此,后面會(huì)寫幾篇有關(guān)算法的學(xué)習(xí)筆記,下面進(jìn)入這篇文章正題:排序算法
冒泡排序排序算法中最簡(jiǎn)單最基礎(chǔ)的就是冒泡排序,這種排序的思想就是相鄰兩個(gè)元素進(jìn)行兩兩比較,大的放后面,每一輪選出最大的元素,讓我們來看具體代碼:
function bubbleSort(arr) { for (var i = 0; i < arr.length - 1; i++) { for (var j = 0; j < arr.length - i - 1; j++) { var temp; if (arr[j] > arr[j + 1]) { // 相鄰兩個(gè)元素比較,大的往后移動(dòng) temp = arr[j] arr[j] = arr[j+1] arr[j+1] = temp } } } console.log(arr) } bubbleSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])
為了更好的看到排序的過程,讓我們來看下面動(dòng)態(tài)圖片:
冒泡排序,在數(shù)組本身就是有序的情況下(最好情況),需要需要n-1次比較能完成,但是在最壞的情況下需要比較和交換n-1+n-2+n-3+...+1=n(n-1)/2次,其算法復(fù)雜度為O(n^2)
選擇排序選擇排序是最直觀簡(jiǎn)單的一種排序算法,具體實(shí)現(xiàn)思路就是:把第一個(gè)元素假定為最小元素,遍歷后面沒有排序的元素,如果發(fā)現(xiàn)比當(dāng)最小元素小的值,就記下數(shù)組下標(biāo),循環(huán)執(zhí)行,當(dāng)一輪循環(huán)結(jié)束,將最小下標(biāo)對(duì)應(yīng)的值和當(dāng)前元素調(diào)換位置,來看具體代碼實(shí)現(xiàn):
function selectionSort(arr) { var index,temp // index:最小值下標(biāo)索引,temp:臨時(shí)變量 for (var i = 0; i < arr.length; i++) { index = i for (var j = i + 1; j < arr.length; j++) { if (arr[j] < arr[index]) { index = j } } temp = arr[i] arr[i] = arr[index] arr[index] = temp } console.log(arr) } selectionSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])
為了更直觀的展示排序的過程,讓我們來看動(dòng)態(tài)圖片展示:
對(duì)于選擇排序來說,比較次數(shù)是固定的,而交換次數(shù)則和數(shù)組的是否有序有關(guān),但數(shù)組是正序時(shí),不需要交換,當(dāng)數(shù)組是倒序時(shí),需要交換n-1次,它的時(shí)間復(fù)雜度是O(n^2)
插入排序插入排序的實(shí)現(xiàn)思路和選擇排序的實(shí)現(xiàn)思路有點(diǎn)類似,先將第一個(gè)元素設(shè)為已排序,然后遍歷剩余的元素,如果已排序的元素大于當(dāng)前的提取元素,已排序的元素向右移動(dòng)一位,否則就將當(dāng)前提取的元素插入,來看具體的代碼實(shí)現(xiàn):
function insetSort(arr) { for (var i = 0; i < arr.length; i++) { var temp = arr[i] // 提取出來的元素 var j = i - 1 while (arr[j] > temp) { // 比較已排序元素和當(dāng)前提取出來的元素 arr[j+1] = arr[j] j-- } arr[j+1] = temp } console.log(arr) } insetSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])
插入排序在最好的情況下,也就是數(shù)組正序排列的時(shí)候,只要執(zhí)行n-1次比較和0次交換時(shí)間復(fù)雜度為O(n),當(dāng)為倒序時(shí),需要n^2/2次比較和n^2/2次交換,其時(shí)間復(fù)雜依然為O(n^2)
總結(jié)這篇文章主要介紹了幾個(gè)最簡(jiǎn)單的排序算法,后面的文章會(huì)繼續(xù)介紹排序算法相關(guān)的內(nèi)容。
如果有錯(cuò)誤或不嚴(yán)謹(jǐn)?shù)牡胤?,歡迎批評(píng)指正,如果喜歡,歡迎點(diǎn)贊收藏
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/100577.html
摘要:動(dòng)態(tài)規(guī)劃背包士兵路徑復(fù)雜度談算法一定要考慮復(fù)雜度時(shí)間復(fù)雜度和空間復(fù)雜度時(shí)間復(fù)雜度計(jì)算機(jī)基本操作的次數(shù)匯編指令的條數(shù)尋址跳轉(zhuǎn)空間復(fù)雜度所需占用的內(nèi)存字節(jié)數(shù)兩者區(qū)別空間是可以返回利用的。 面試求職班一筆記 算法主要研究:時(shí)空復(fù)雜度 算法的特征: 有窮性, 確定性, 可行性, 可能沒有輸入,但一定有輸出 常用算法 窮舉法(eg:求N個(gè)數(shù)的全排列;8皇后問題) 減而治之(二分查找...
摘要:本文記錄了我在學(xué)習(xí)前端上的筆記,方便以后的復(fù)習(xí)和鞏固。冒泡排序算法步驟比較相鄰的元素。這步做完后,最后的元素會(huì)是最大的數(shù)。重復(fù)第二步,直到所有元素均排序完畢。得到序列第二趟,,和進(jìn)行交換。 本文記錄了我在學(xué)習(xí)前端上的筆記,方便以后的復(fù)習(xí)和鞏固。推薦大家去看看這一本gitBook上的書十大經(jīng)典排序算法本文就是看這本書記錄的筆記。 冒泡排序 1.算法步驟 1.比較相鄰的元素。如果第一個(gè)比第...
摘要:排序算法學(xué)習(xí)筆記用于創(chuàng)建數(shù)組冒泡排序冒泡排序比較任何兩個(gè)相鄰的項(xiàng),如果第一個(gè)比第二個(gè)大,則交換它們。歸并排序歸并排序是一種分治算法。完成下列操作的前提是數(shù)組均已經(jīng)完成。 javaScript排序算法學(xué)習(xí)筆記 // 用于創(chuàng)建數(shù)組 function createNonSortedArray(size) { var array = new ArrayList(); for( ...
摘要:上一篇中已經(jīng)介紹了幾個(gè)簡(jiǎn)單的排序算法,這一篇文章我將繼續(xù)向大家介紹排序算法相關(guān)的內(nèi)容,本篇的會(huì)介紹希爾排序快速排序歸并排序以及分治算法的思想,希望通過本文章能夠加深大家對(duì)排序算法的理解。 上一篇中已經(jīng)介紹了幾個(gè)簡(jiǎn)單的排序算法,這一篇文章我將繼續(xù)向大家介紹排序算法相關(guān)的內(nèi)容,本篇的會(huì)介紹希爾排序、快速排序、歸并排序以及分治算法的思想,希望通過本文章能夠加深大家對(duì)排序算法的理解。 希爾排序...
摘要:強(qiáng)烈推薦上值得前端學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)與算法項(xiàng)目,包含圖的演示過程與視頻講解。該倉庫包含了多種基于的算法與數(shù)據(jù)結(jié)構(gòu),提供進(jìn)一步閱讀的解釋和鏈接。數(shù)據(jù)結(jié)構(gòu)和算法必知必會(huì)的個(gè)代碼實(shí)現(xiàn)。 showImg(https://segmentfault.com/img/bVbvpYZ); 前言 算法為王。想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,就算招式練的再花哨,終究成不了高手;只有內(nèi)功深厚者,前端之路才會(huì)走得...
閱讀 1063·2019-08-30 15:55
閱讀 3508·2019-08-30 13:10
閱讀 1333·2019-08-29 18:45
閱讀 2414·2019-08-29 16:25
閱讀 2171·2019-08-29 15:13
閱讀 2489·2019-08-29 11:29
閱讀 610·2019-08-26 17:34
閱讀 1553·2019-08-26 13:57