日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

JavaScript算法相关

發(fā)布時(shí)間:2023/12/10 javascript 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript算法相关 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 排序

1.1.冒泡排序

  • 每一輪比較,從左至右交換相鄰,每輪結(jié)束,最后一個(gè)為最大
  • 下一輪,需要比較的個(gè)數(shù) - 1 j < len - i (范圍動(dòng)態(tài)縮小)
  • 共 len - 1 輪比較
function bubbleSort(arr) {var len = arr.length;for (var i = 1; i < len; i++) {for (var j = 0; j < len - i; j++) {if (arr[j] > arr[j+1]) { //相鄰元素兩兩對(duì)比var temp = arr[j+1]; //元素交換arr[j+1] = arr[j];arr[j] = temp;}}}return arr; }

冒泡排序算法改進(jìn)思想:

  • 個(gè)數(shù)較多的排序,(比如)從第6輪開(kāi)始,數(shù)列已經(jīng)有序,然而排序算法依然會(huì)執(zhí)行第7、8輪直到結(jié)束:添加標(biāo)志,一開(kāi)始為1,只要有交換便置為0,在外層循環(huán)里添加if判斷,if(標(biāo)志為1) { break }
  • 當(dāng)序列中某一段在比較之前就已經(jīng)就是有序的:可以在每一輪排序的最后,記錄下最后一次元素交換的位置,那個(gè)位置也就是無(wú)序數(shù)列的邊界,再往后就是有序區(qū)了
  • 正反向冒泡排序
function bubbleSort(arr) {console.time('冒泡排序耗時(shí)')var len = arr.lengthvar lastChangeIndex = 0 // 初始,最后一次交換位置var sortBorder = len -1 // 初始有序邊界為最后一值for (var i = 1; i < len; i++) {var isSorted = truefor (var j = 0; j < sortBorder; j++) {if (arr[j] > arr[j+1]) { //相鄰元素兩兩對(duì)比var temp = arr[j+1] //元素交換arr[j+1] = arr[j]arr[j] = tempisSorted = falselastChangeIndex = j}}sortBorder = lastChangeIndexif(isSorted) {break}}console.timeEnd('冒泡排序耗時(shí)')return arr }var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48] console.log(bubbleSort(arr)) function bubbleSort3(arr3) {var low = 0;var high= arr.length-1; //設(shè)置變量的初始值var tmp,j;console.time('2.改進(jìn)后冒泡排序耗時(shí)');while (low < high) {for (j= low; j< high; ++j) //正向冒泡,找到最大者if (arr[j]> arr[j+1]) {tmp = arr[j]; arr[j]=arr[j+1];arr[j+1]=tmp;}--high; //修改high值, 前移一位for (j=high; j>low; --j) //反向冒泡,找到最小者if (arr[j]<arr[j-1]) {tmp = arr[j]; arr[j]=arr[j-1];arr[j-1]=tmp;}++low; //修改low值,后移一位}console.timeEnd('2.改進(jìn)后冒泡排序耗時(shí)');return arr3; } var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; console.log(bubbleSort3(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

循序漸進(jìn)的過(guò)程:
冒泡排序2次改進(jìn)
JavaScript算法(含冒泡排序3次改進(jìn))

1.2. 選擇排序

思想:

  • len-1 輪排序
  • 每輪排序,選出最小的數(shù),放在最前的位置

1.3. 插入排序

思想: 打牌

1.4. 希爾排序

  • 確定一個(gè)增量
    -

1.5. 快速排序

  • 首先設(shè)定一個(gè)分界值,通過(guò)該分界值將數(shù)組分成左右兩部分。
  • 將大于或等于分界值的數(shù)據(jù)集中到數(shù)組右邊,小于分界值的數(shù)據(jù)集中到數(shù)組的左邊。
  • 然后,左邊和右邊的數(shù)據(jù)可以獨(dú)立排序。對(duì)于左側(cè)的數(shù)組數(shù)據(jù),又可以取一個(gè)分界值,將該部分?jǐn)?shù)據(jù)分成左右兩部分,同樣在左邊放置較小值,右邊放置較大值。右側(cè)的數(shù)組數(shù)據(jù)也可以做類似處理。
  • 重復(fù)上述過(guò)程,可以看出,這是一個(gè)遞歸定義。通過(guò)遞歸將左側(cè)部分排好序后,再遞歸排好右側(cè)部分的順序。當(dāng)左、右兩個(gè)部分各數(shù)據(jù)排序完成后,整個(gè)數(shù)組的排序也就完成了。

1.6. 隨機(jī)排序

  • Math.random()得到的是0~1之間的隨機(jī)數(shù);
  • sort()可以調(diào)用一個(gè)函數(shù)做為參數(shù),這個(gè)函數(shù)接收(a,b)兩個(gè)參數(shù),
    ① a<b返回-1 (小于0的值)
    ② a=b返回0,
    ③ a>b返回1(大于0的值),
    以這樣的規(guī)則返回正負(fù)數(shù)的函數(shù),排序結(jié)果為升序;
arr.sort((a, b) => a - b) // 升序排序 arr.sort((a, b) => b - a) // 降序排序
  • 讓Math.random()隨機(jī)出來(lái)的數(shù)與0.5做為一個(gè)比較,為正為負(fù)的幾率各一半
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; arr.sort(function() {return Math.random() - 0.5; }) console.log(arr);

2. 函數(shù)柯里化

詳解JS函數(shù)柯里化

3. 技巧方法

  • 字符串倒序
str.split('').reverse().join('')
  • 斐波那契
function getFibo(i) {if (i == 0 || i == 1) {return 1} else {return arguments.callee(i-1) + arguments.callee(i-2)} }
  • 數(shù)組最值
Math.max(...arr) Math.min(...arr)

總結(jié)

以上是生活随笔為你收集整理的JavaScript算法相关的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。