javascript
JavaScript数据结构与算法——基本排序算法
之前以下三種排序算法屬于三篇文章,由于都屬于基本排序算法,就合并到了一篇,便于對比。
1、冒泡排序
冒泡排序算法簡介:
? ? ? ? ? ? ?冒泡排序算法,它是最慢的排序算法之一,但也是一種最容易實現的排序算法。?之所以叫冒泡排序是因為使用這種排序算法排序時,數據值會像氣泡一樣從數組的一端漂浮到另一端。假設正在將一組數字按照升序排列,較大的值會浮動到數組的右側,而較小的值則會浮動到數組的左側。之所以會產生這種現象是因為算法會多次在數組中移動,比較相鄰的數據,當左側值大于右側值時將它們進行互換。?
觀察規律:以下是數組[72,? 54, 58, 30, 31, 78,? 2, 77, 82, 72]在進行小到大排序時的各次排序的結果,第一行為數組初始值。
注意觀察72和2的是如何移動到右邊、左邊的,之后會以完整代碼舉例深入剖析。
解釋:在第一次排序中,72與54比較,54移到前面,隨后72與58比較,58移到前面......72與78比較時,72小,于是順序不變,接而78與2對比,2移到前面,接下來78與77比較,77移到前面...于是第一次排序后結果是:54 58 30 31 72 2 77 78 72 82。根據這規律,不難解釋接下來的幾次排序。
冒泡排序演練:使用冒泡排序算法對數組[10,1,8,6,7,5,3,4,2,9]進行升序排序。
實現代碼:
<script>function bubbleSort(array) {var length = array.length;var temp;// i可以理解為每次參與排序的項有幾個// 第一次排序之后,最后一個肯定比前一個大,所以下一次不用再對比最后兩個數字// 所以i--,減少參與排序的數字的個數,即第二次參與排序的項只有[1,8,6,7,5,3,4,2,9]共9個。// 以此類推,最后參與對比的項只有兩個,即最后i==2。for (var i = length; i >= 2; i--) {// 開始循環對比需要對比的項for (var j = 0; j <= i - 1; j++) {if (array[j] > array[j + 1]) {// 前面的比后面的大,交換位置temp = array[j];array[j] = array[j + 1];array[j+1] = temp;}}console.log("第"+(length-i+1)+"次排序結果:"+array.toString()+"--此次參與排序的項為=>"+i); // 用于觀察每次排序的結果}console.log("最終結果:"+array.toString()); // 最終結果}var array = [10,1,8,6,7,5,3,4,2,9];bubbleSort(array); </script>?
運行結果如圖:
?
總結:
? ? ? ?實現方法幾乎每行代碼都加以解釋,幫助理解;結合每次排序的結果我們可以更加容易地看出小的值是如何移到數組開頭的,
大的值又是如何移到數組末尾的,每次參與排序的項有多少個,冒泡排序神秘的面紗就此揭開。實現降序排序:實現數組降序排序只需要修改內層循環中的條件判斷即可,相信各位能輕易實現。
if (array[j] < array[j + 1]) {// 后面的比前面的大,交換位置temp = array[j];array[j] = array[j+1];array[j+1] = temp; }降序排序運行結果:
?
2、選擇排序
升序原理:使用尋找最小值的方法去遍歷剩余數組,記錄最小值得下標index,然后跟首位交換位置。?
比如對4 3 6 8 2 9 10進行排序?
第一次排序后的結果為:?
2 3 6 8 4 9 10?
第二次:?
2 3 6 8 4 9 10?
因為剩余的數字中3最小,位置不用變化?
第三次:?
2 3 4 8 6 9 10?
第四次?
……..?
按照以上推算,可得到以下實現代碼:
進入控制臺,使用node運行此js文件,可見結果為:?
3、插入排序
//????插入排序-原理解釋:從數組第二項開始循環,每次循環取當前項與前邊的項對比,符合條件則交換位置。??function?insertSort(array)?{?? //????????從第二個元素開始循環??for?(var?i?=?1;?i?<?array.length;?i++)?{?? //??????????從當前項開始往前對比??for?(var?j?=?i;?j?>?0;?j--)?{?? //????????????????前面的比后面的大,交換位置??if?(array[j-1]?>?array[j])?{??var?temp?=?array[j];??array[j]?=?array[j?-?1];??array[j?-?1]?=?temp;??}??}??}??console.log(array.toString());??}??insertSort([1,4,5,7,2,9,8]);??運行結果:
4、快速排序
function quickSort (arr) {let length = arr.lengthif (length <= 1) {return arr}let base = arr[length - 1]let left = [], right = []for (let i = 0; i < length - 1; i++) {if(arr[i] > base) {right.push(arr[i])} else {left.push(arr[i])}}return [...quickSort(left), base, ...quickSort(right)]}console.log(quickSort([3,23,66,32,2,77,45,87,64,34,33]))運行結果:
總結
以上是生活随笔為你收集整理的JavaScript数据结构与算法——基本排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue.JS项目导入导出JSON文件的方
- 下一篇: rsync 远程同步