摘要:排序算法學(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( var i = size; i>0; i--) { array.insert(i); } return array; } function ArrayList() { var array = []; this.insert = function(item) { console.log(item, "insert"); array.push(item); } this.toString = function() { console.log("tostring"); return array.join(); } /* * 冒泡排序 * 冒泡排序比較任何兩個(gè)相鄰的項(xiàng),如果第一個(gè)比第二個(gè)大,則交換它們。 * 元素項(xiàng)向上移動(dòng)至正確的順序,就好像氣泡升至表面一樣,冒泡排序因此得名。 * 第一輪比過(guò)之后最后一個(gè)就一定是最大的 無(wú)需再比較。所以下次要 - i */ this.bubbleSort = function() { var length = array.length; for(var i = 0;iarray[j + 1]) { swap(array, j, j+1); } } } } /* * 選擇排序 * 選擇排序算法是一種原址比較排序算法。選擇排序大致的思路是找到數(shù)據(jù)結(jié)構(gòu)中的最小值 * 并將其放置在第一位,接著找到第二小的值并將其放在第二位,以此類(lèi)推。比如,第一個(gè) * 的時(shí)候,會(huì)遍歷后面所有想跟其比較,找到最小的更其交換。所以第一個(gè)此時(shí)一定是最小的。 * 隨意第二個(gè)的時(shí)候,只會(huì)循環(huán)后面的幾個(gè)。如果找到一個(gè)比第二個(gè)更小的,那么交換位置。 */ this.selectionSort = function() { var length = array.length, indexMin; for(var i = 0;i< length - 1;i++) { indexMin = i; for(var j = i;j array[j]) { indexMin = j; } } if (i !== indexMin) { swap(array, i, indexMin); } } } /* * 插入排序 * 插入排序每次排第一個(gè)數(shù)組項(xiàng),以此方式構(gòu)建最后的排序數(shù)組。假定第一項(xiàng)已經(jīng)排序了,接著, * 它和第二項(xiàng)進(jìn)行比較,第二項(xiàng)是應(yīng)該待在原位還是插到第一項(xiàng)之前呢?這樣,頭兩項(xiàng)就已正確 * 排序,接著和第三項(xiàng)比較(它是該插入到第一、第二還是第三位置呢?),以此類(lèi)推。 * 簡(jiǎn)而言之,就是遍歷數(shù)組的每一項(xiàng),拿這一項(xiàng)去跟前面的項(xiàng)比較,如果比他小就插入到它前面。 */ this.insertionSort = function() { var length = array.length, j,temp; for (var i = 1;i 0 && array[j-1] > temp) { array[j] = array[j - 1]; j--; } array[j] = temp; } } // 歸并排序 // 歸并排序是一種分治算法。其思想是將原始數(shù)組切分成較小的數(shù)組,直到每個(gè) // 小數(shù)組只有一個(gè)位置,接著將小數(shù)組歸并成較大的數(shù)組,直到最后一個(gè)排序完畢的大數(shù)組。 this.mergeSort = function() { array = mergeSortRec(array); } var mergeSortRec = function(array) { var length = array.length; if (length === 1) { return array; } var mid = Math.floor(length / 2), left = array.slice(0, mid), right = array.slice(mid, length); return merge(mergeSortRec(left), mergeSortRec(right)); } var merge = function(left, right) { var result = [], il = 0, ir = 0; // 完成下列操作的前提是left、right數(shù)組均已經(jīng)完成。所以采用遞歸的形式 // 在數(shù)組長(zhǎng)度為1的時(shí)候先開(kāi)始排序,然后在通過(guò)merge left與right數(shù)組 while(il < left.length && ir < right.length) { if (left[il] < right[ir]) { result.push(left[il++]); } else { result.push(right[ir++]); } } // 上面是將left與right數(shù)組排完序,那么其中之一數(shù)組必然為空, // 下面的操作就是將剩下的right或者left全部推入result數(shù)組中 while(il < left.length) { result.push(left[il++]); } while(ir < right.length) { result.push(right[ir++]); } return result; } // 快速排序 // 首先,從數(shù)組中選擇中間一項(xiàng)作為主元 // 創(chuàng)建兩個(gè)指針,左邊一個(gè)指向數(shù)組的第一項(xiàng),右邊一個(gè)指向數(shù)組的最后一個(gè)項(xiàng)。 // 移動(dòng)左指針直到我們找到一個(gè)比主元大的元素,接著,移動(dòng)右指針直到找到一個(gè) // 比主元小的元素,然后交換他們,重復(fù)這個(gè)過(guò)程,直到左指針超過(guò)右指針。這個(gè) // 過(guò)程將使得比主元小的值都排在主元之前,而比主元大的值都排在主元之后。這一步 // 叫做劃分操作。 // 接著,算法對(duì)劃分后的小數(shù)組(較主元小的值組成的子數(shù)組,以及較主元大的值 // 組成的子數(shù)組)重復(fù)之前的兩個(gè)步驟,直到數(shù)組已完全排序。 // 簡(jiǎn)而言之,先分治,不斷的細(xì)化下去,到最后一個(gè)數(shù)組無(wú)法再交換位置進(jìn)行排序位置 this.quickSort = function() { quick(array, 0, array.length - 1); } var quick = function(array, left, right) { var index; if (array.length > 1) { index = partition(array, left, right); if (left < index - 1 ) { quick(array, left, index - 1); } if (index < right) { quick(array, index, right); } } } var partition = function(array, left, right) { var pivot = array[Math.floor((left + right) / 2)], i = left, j = right; while(i <= j) { while(array[i] < pivot) { i++; } while(array[j] > pivot) { j--; } if (i <= j) { swap(array, i, j); i++; j--; } } return i; } var swap = function(array, index1, index2) { var aux = array[index1]; array[index1] = array[index2]; array[index2] = aux; } } var array = createNonSortedArray(9); console.log(array.toString()); array.bubbleSort(); // array.selectionSort(); // array.insertionSort(); // array.mergeSort(); // array.quickSort(); console.log(array.toString());
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/109127.html
摘要:強(qiáng)烈推薦上值得前端學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)與算法項(xiàng)目,包含圖的演示過(guò)程與視頻講解。該倉(cāng)庫(kù)包含了多種基于的算法與數(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ì)走得...
摘要:本文記錄了我在學(xué)習(xí)前端上的筆記,方便以后的復(fù)習(xí)和鞏固。冒泡排序算法步驟比較相鄰的元素。這步做完后,最后的元素會(huì)是最大的數(shù)。重復(fù)第二步,直到所有元素均排序完畢。得到序列第二趟,,和進(jìn)行交換。 本文記錄了我在學(xué)習(xí)前端上的筆記,方便以后的復(fù)習(xí)和鞏固。推薦大家去看看這一本gitBook上的書(shū)十大經(jīng)典排序算法本文就是看這本書(shū)記錄的筆記。 冒泡排序 1.算法步驟 1.比較相鄰的元素。如果第一個(gè)比第...
摘要:技巧使你的更加專(zhuān)業(yè)這是上關(guān)于技巧的一篇譯文,另外你也可以在本項(xiàng)目看到原文。列舉了一些很實(shí)用的技巧,比如給空內(nèi)容的標(biāo)簽添加內(nèi)容,逗號(hào)分隔列表等等。排序算法看源碼,把它背下來(lái)吧排序算法的封裝。主要幫助初學(xué)者更好的掌握排序算法的實(shí)現(xiàn)。 成為專(zhuān)業(yè)程序員路上用到的各種優(yōu)秀資料、神器及框架 成為一名專(zhuān)業(yè)程序員的道路上,需要堅(jiān)持練習(xí)、學(xué)習(xí)與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 Java...
摘要:技巧使你的更加專(zhuān)業(yè)這是上關(guān)于技巧的一篇譯文,另外你也可以在本項(xiàng)目看到原文。列舉了一些很實(shí)用的技巧,比如給空內(nèi)容的標(biāo)簽添加內(nèi)容,逗號(hào)分隔列表等等。排序算法看源碼,把它背下來(lái)吧排序算法的封裝。主要幫助初學(xué)者更好的掌握排序算法的實(shí)現(xiàn)。 成為專(zhuān)業(yè)程序員路上用到的各種優(yōu)秀資料、神器及框架 成為一名專(zhuān)業(yè)程序員的道路上,需要堅(jiān)持練習(xí)、學(xué)習(xí)與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 Java...
摘要:排序算法主要針對(duì)的是數(shù)組,所以,在開(kāi)始學(xué)習(xí)之前,我們先自己新建一種數(shù)據(jù)結(jié)構(gòu)來(lái)方便我們的學(xué)習(xí)。統(tǒng)計(jì)執(zhí)行次數(shù)冒泡排序比較相鄰兩個(gè)數(shù)的大小,如果前面的數(shù)大于后面,則交換這兩個(gè)數(shù)的位置。所以我們把數(shù)列分割成不超過(guò)兩個(gè)元素的數(shù)組,然后將其合并。 ??排序算法主要針對(duì)的是數(shù)組,所以,在開(kāi)始學(xué)習(xí)之前,我們先自己新建一種數(shù)據(jù)結(jié)構(gòu)來(lái)方便我們的學(xué)習(xí)。 function ArrayData () { l...
閱讀 866·2023-04-25 17:33
閱讀 3723·2021-07-29 14:49
閱讀 2535·2019-08-30 15:53
閱讀 3523·2019-08-29 16:27
閱讀 2063·2019-08-29 16:11
閱讀 1089·2019-08-29 14:17
閱讀 2581·2019-08-29 13:47
閱讀 2089·2019-08-29 13:28