亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

排序算法的javascript實現與講解(99js手記)

2019-11-20 14:05:14
字體:
來源:轉載
供稿:網友

冒泡排序

冒泡的原理是讓最大元素或者最小元素”浮起來“

插入排序,選擇排序,快速排序,冒泡排序都是比較排序

思路

依次比較相鄰的兩個數,將小數放在前面,大數放在后面。

step1:比較第1個和第2個數,將小數放前,大數放后。比較第2個數和第3個數,將小數放前,大數放后,如此繼續,直至比較最后兩個數,將小數放前,大數放后。
step2:在第二趟:仍從第一對數開始比較(因為可能由于第2個數和第3個數的交換,使得第1個數不再小于第2個數),將小數放前,大數放后,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到一個新的最大數(其實在整個數列中是第二大的數)。
如此下去,重復以上過程,直至最終完成排序。
由于在排序過程中總是小數往前放,大數往后放,相當于氣泡往上升,所以稱作冒泡排序。
冒泡排序的動畫效果

實現:此段代碼比較簡單,是屬于算法里面最基礎最基礎最基礎的代碼。。。
要注意三點

1.交換類的方法在javascript中可以用 a=[b,b=a][0] 這個非常巧妙的方法來解決,
代替

復制代碼 代碼如下:

var,a,b,temp
temp = a;
a=b;
b = temp

這種交換方法
2.要注意循環變量的緩存,這里緩存了array.length
3.要注意內嵌的那個循環,是從第一個數比較到倒數第n個數,n則為比較的step數

function bubbleSort(array) {var l=array.length;for (var i = 0; i < l; i++) {//比較的step數為數組的長度for (var j = 0; j < l-i; j++) {//內嵌交換的次數是從第一個數比較到倒數第總長-n個數,n則為比較的step數if (array[j] < array[j - 1]) {array[j] = [array[j - 1], array[j - 1] = array[j]][0]//在這里交換元素}}for (var k = 0; k < l; k++) {console.log(array[k] + ",");}console.log('這是第'+(i+1)+'次排序')}}var a = [6,54,6,22,5,7,8,2,34];bubbleSort(a);

動畫效果

插入排序(Insertion Sort)
非常簡單,就是我們摸牌插牌的步驟!
思路:

1首先假設我們摸了一張牌,我們手里目前所有牌設為empty = []摸了一張push(arr[0])
2取出下一個牌,設為a,在我們所有的牌empty(已經排序)從后向前掃描
3如果手里這張牌empty[empty.length-n](已排序)大于新元素,將該牌移到下一位置(騰空間)empty[empty.length-n]= empty[empty.length-n+1]
4重復步驟3,直到找到已排序的牌empty[empty.length-n]小于或者等于a
5將a插入到該位置中 empty[empty.length-n]=a
6重復步驟2
但是javascript代碼實現起來還是稍微有些難度的,代碼如下:

function insert(arr) {var l = arr.length;var empty = [];//空數組,表示我們的手empty.push(arr[0]);//我們先摸起來一張for (var i = 1; i < l; i++) {//注意這里起點是1,因為我們已經摸了一張了!if (arr[i] > empty[empty.length - 1]) {empty[empty.length] = arr[i]} //如果比有序數組empty還大,直接放到末尾for (var j = empty.length; j > 0 && arr[i] < empty[j - 1]; j--) { //從最大值跟arr進行比較,為了給arr騰空。當arr<有序數組的某一位時,就不用移動了。empty[j] = empty[j - 1]; //向右移動empty[j - 1] = arr[i]; //把值放到空出來的位置上}//console.log(empty)}return empty}

那么這里比較重要的知識點是&&符號,表示“與”,即兩邊的條件都要滿足,表達式才成立。
&&符號也可以代替if比如 if(a){fun()} 等于 a&&b
另外一點非常重要
設數組是arr,則他的“最后一項” 是arr[arr.length-1]。

排序動畫


選擇排序(Selection sort)
也是一種簡單的排序算法。

思路:

把最小元素找出來-扔到數組里-再找次小的-扔到數組里,以此類推。
首先在未排序數組中找到最小元素,找的方法可以利用不斷判斷并賦值的手段,即:設數組第一個元素array[0]為最小元素,那么“最小元素”在數組中的序號就為0
之后遍歷數組,若數組第二個元素比他還要小,那么說明第二個為最小元素,把“0” 更新為“1”。
遍歷完畢后,我們就知道這一系列的最小元素下標為“n”;直接拿出來存放到排序序列的起始位置(array[n])
然后,再從剩余未排序元素中繼續尋找最小元素,然后放到排序序列末尾。注意,此時遍歷的下標就從1開始了。因為我們已經挑出了一個最小元素了。
以此類推,直到所有元素均排序完畢。

function selectSort(array) {var min;var l = array.length;//緩存長度for (var i = 0; i < l; i++) {//開始進行循環,一共循環l次,就可以找出l個元素了min = i;//假設第一個為最小元素for (var j = i + 1; j < l; j++) {//從第一個開始循環,遍歷if (array[min] > array[j])//判斷之后的是否比前面的小min = j;//更新“最小”的下標}if (min != i) {//這里因為是在同一個數組內進行操作,所以直接交換元素即可。比如數組第一項是i,那么我找出了最小元素為array[min],那么我就需要把這個min跟i交換。以此類推。array[i]= [array[min],array[min]=array[i]][0];//交換元素}}return array;}

這里仍然注意的是交換的寫法 array[i]= [array[min],array[min]=array[i]][0]
可以方便的把array[i]與array[min]交換~

排序動畫

快速排序
 
快速排序是目前最強大的排序算法,算法利用了遞歸的思想。
 
思路

從數組中挑出一個元素,稱為 “基準”,這個可以直接利用length/2挑出來
遍歷數組,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數可以到任一邊)。通俗來講:男的站左邊,女的站右邊。。
之后我們得到了一個這樣的數組 array= 比基準小的部分組成的數組lArray+基準+比基準大的部分組成的數組rArray。
那么我們之后只需要再把lArray,rArray進行“同樣的”處理即可~
這就需要用到 遞歸 的寫法了。處理之后,lArray又分成了 lArray的基準,比lArray基準還小的,比lArray基準還大的。。
那么我們不斷的進行操作,男的站左邊,女的站右邊。。
直到我們發現,lArray的長度變成1了,不足以再分下去了,我們認為排序結束。

function quickSort(arr) {var l = arr.length;//緩存數組長度if(arr.length <= 1){return arr}; //如果我們拿到的lArray,rArray長度比1都小,那就不用排了~var num = Math.floor(arr.length / 2);//取數組中間的那個數。注意length/2不一定是整數,用Math.floor取整var numValue = arr.splice(num, 1)[0];//利用splice方法,取一個元素出來,注意語法var left = [];//創建左邊基準容器var right = [];//創建右邊基準容器for (var i = 0; i < l; i += 1) {//開始遍歷數組arr[i] < numValue ? left.push(arr[i]) : right.push(arr[i]);//男的站左邊,女的站右邊。。}return quickSort(left).concat([numValue], quickSort(right))//遞歸,繼續對左右數組進行操作。}

動畫效果:

這里注意 arr.splice(num,1)雖然只抽了一個數,但splice的結果也是數組,需要[0],要不然結果就會很奇葩的出現一堆array(1)的數組了。。。
splice的參考://www.49028c.com/w3school/js/jsref_splice.htm
Math.floor即Math對象的參考//www.49028c.com/w3school/js/js_obj_math.htm
遞歸是什么:http://baike.baidu.com/view/96473.htm

以上四個算法除了快速排序,都是簡單排序算法,而這四個算法在面試中考的都非常頻繁~
在這里仍然要強調一點,以上的算法大量使用了循環及數組的相關知識,一定要背熟!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人免费一级人片100| 亚洲91精品在线| 国产一区二区视频在线观看| 国产成人av在线播放| 色阁综合伊人av| 亚洲精品白浆高清久久久久久| 国产噜噜噜噜久久久久久久久| 亚洲精品电影在线| 国产精品久久久久久av下载红粉| 久久久久久久一区二区| 欧美黑人极品猛少妇色xxxxx| 久久精品小视频| 欧美国产高跟鞋裸体秀xxxhd| 国产成人精品在线| 热久久视久久精品18亚洲精品| 久久男人的天堂| 久久亚洲国产精品| 97视频人免费观看| 亚洲自拍偷拍第一页| 国产精品久久久久久久美男| 岛国av午夜精品| 国产精品三级在线| 日韩精品小视频| 中文字幕日本欧美| 成人在线中文字幕| 国产欧美精品一区二区三区-老狼| 国产精品日韩专区| 深夜成人在线观看| 国产精品国模在线| 韩国视频理论视频久久| 影音先锋欧美精品| 在线视频精品一| 97国产精品视频人人做人人爱| 欧美精品成人91久久久久久久| 精品亚洲国产成av人片传媒| 欧美成人精品激情在线观看| 久久精品国产亚洲精品| 91国内精品久久| 国产精品一区久久久| 久久精品视频亚洲| 国产精品678| 尤物九九久久国产精品的特点| 亚洲成人网在线观看| 成人免费视频在线观看超级碰| 亚洲影视九九影院在线观看| 久久久久久久久久久国产| 精品久久在线播放| 久久久av电影| 欧美中文在线观看| 日韩欧美高清视频| 亚洲女人天堂成人av在线| 国产精品电影网站| 欧美成人四级hd版| 成人福利在线视频| 欧美激情一区二区三区成人| 成人免费xxxxx在线观看| 亚洲精品福利免费在线观看| 国产精品美女无圣光视频| 97人人爽人人喊人人模波多| 国产成人精品一区二区在线| 精品色蜜蜜精品视频在线观看| 久久精品国产一区二区电影| 成人春色激情网| 欧美日韩电影在线观看| 国产精品欧美日韩久久| 亚洲电影免费观看高清完整版在线| 亚洲黄色av网站| 3344国产精品免费看| 日韩av在线免费| 国产视频久久久久久久| 成人国产精品日本在线| 97香蕉久久超级碰碰高清版| 亚洲第一天堂无码专区| 亚洲成人三级在线| 91中文字幕一区| 国产精品网址在线| 亚洲激情小视频| 亚洲精品国产成人| 在线观看91久久久久久| 国产成人拍精品视频午夜网站| 日韩高清电影免费观看完整| 久久久精品影院| 7m精品福利视频导航| 日韩有码片在线观看| 亚洲成人1234| 国产在线观看一区二区三区| 亚洲精品www久久久| 在线观看国产精品日韩av| 欧美在线国产精品| 国产精品中文字幕在线观看| 亚洲福利精品在线| www.xxxx精品| 992tv在线成人免费观看| 欧美麻豆久久久久久中文| 96sao精品视频在线观看| 欧美日韩亚洲国产一区| 国内久久久精品| 91精品视频在线| 亚洲aⅴ男人的天堂在线观看| 伊人亚洲福利一区二区三区| 欧美xxxx做受欧美| 久久精品中文字幕一区| 欧美极品少妇xxxxⅹ裸体艺术| 中文字幕在线日韩| 中文字幕精品—区二区| 成人激情免费在线| 国产精品成人一区| 日韩在线观看成人| 亚洲精品中文字幕av| 亚洲最大在线视频| 国产精品成人播放| 日韩精品免费看| 欧美成人激情视频免费观看| 欧美日韩高清区| 国产91ⅴ在线精品免费观看| 97在线免费观看视频| 亚洲性av网站| 国产亚洲精品一区二555| 91精品国产91久久久久久最新| 国产视频精品一区二区三区| 国产午夜精品全部视频播放| 国产欧美日韩视频| 日韩视频在线观看免费| 91精品91久久久久久| 国产成人精品一区| 国产精品入口尤物| 久久久精品亚洲| 亚洲精品国产精品国自产在线| 亚洲成人精品视频在线观看| 亚洲一区二区三区在线视频| 亚洲片在线资源| 性日韩欧美在线视频| 欧美日韩中文在线观看| 国产美女扒开尿口久久久| 亚洲午夜激情免费视频| 国产91精品久久久久久| 国产日韩欧美中文| 日韩在线欧美在线国产在线| 日韩精品视频中文在线观看| 国产一区二区三区三区在线观看| 欧美激情视频一区二区| 亚洲一区免费网站| 日韩在线观看免费全| 久久99精品国产99久久6尤物| 亚洲第一男人天堂| 日韩精品在线观看一区| 久久精品影视伊人网| 国产不卡视频在线| 北条麻妃99精品青青久久| 欧美午夜精品久久久久久浪潮| 亚洲国产精品va在线| 亚洲人成电影在线观看天堂色| 国产精品久久久久aaaa九色| 精品在线观看国产| 亚洲最大福利视频网| 国产一区二区三区视频在线观看| 粗暴蹂躏中文一区二区三区| 欧美精品18videosex性欧美| 国产成人精品日本亚洲专区61| 久久中文字幕一区| 欧美成人中文字幕| 欧美一级bbbbb性bbbb喷潮片| 色av中文字幕一区| 日韩av第一页|