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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

原生js数组排序

發(fā)布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 原生js数组排序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原生js數(shù)組排序

js 排序 以正序為例(即由小到大)

var arr = [0,2,1,4,3,9,6,5,7,8]; // 未排序的數(shù)組 var sortArr = null; // 排序后得到的數(shù)組

1 sort排序

sortArr = arr.sort(function (a,b) {return a - b })

sort是es3增加的數(shù)組方法,大家可以放心使用(支持到ie6),但是數(shù)組在原數(shù)組上進行排序,不生成副本。這個時候我們的sortArr === arr是同一個數(shù)組

2 普通for循環(huán)排序

function sort (arr) {var newArr = [arr[0]];var nl = newArr.length;var ol = arr.length;for (var i = 1; i <= ol - 1; i++) {nl = newArr.length;for (var j = 0; j <= nl - 1; j++) {if(newArr[j]>=arr[i]){newArr.splice(j, 0, arr[i]);break;}else if(j == nl - 1){newArr.push(arr[i])}}}return newArr; } sortArr = sort(arr);

*此方法會重新生成一個數(shù)組,并對其進行排序,但是缺點是執(zhí)行效率低,當數(shù)據(jù)量較大時,*強烈不建議使用此方法

3 二分法排序

function twoSort (arr) {var len = arr.length;var left = 0, right = 0, point = 0; //定義三個標記位,point就是最中間的位置var nArr = [];nArr[0] = arr[0]; //定義一個數(shù)組后,把arr中第一個數(shù)先賦給nArrfor(var i=1; i<len; i++){left = 0;var nLen = nArr.length;right = nLen;for(var j=0; j<nLen; j++){point = Math.floor((left + right)/2); //取整if(nArr[point] < arr[i]){left = point + 1; //注意必須加1}else{right = point;}if(right == left){ //如果right和left相等就表示找到了插入的位置 ,插入后,跳出循環(huán)nArr.splice(left,0,arr[i]);break;}}}return nArr; } sortArr = sort(arr);

此方法會重新生成一個數(shù)組,并對其進行排序,并且執(zhí)行效率較高,但是代碼量比較大,對于我們這種愛研(de)究(se)的同學來說是不會滿足于此的。

4 遞歸二分法排序的兩種寫法

法1

function recursiveSort1(arr) {if (arr.length <= 1) { return arr; }//如果輸入數(shù)組長度小于等于1,直接返回數(shù)組。這也是遞歸算法的終結(jié)部分var base = Math.floor(arr.length / 2);//找到中間的基準元素位置var baseEle = arr.splice(base, 1)[0];//把基準元素從arr中摘除var left = [];var right = [];for (var i = 0; i < arr.length; i++) {if (arr[i] < baseEle) {left.push(arr[i]);} else {right.push(arr[i]);}}return recursiveSort(left).concat([baseEle ], recursiveSort(right));//返回遞歸左右兩個部分concat中間元素,這就是結(jié)果 }; sortArr = recursiveSort1(arr);

法2

function recursiveSort2(arr) {if (arr.length <= 1) { return arr; }//如果輸入數(shù)組長度小于等于1,直接返回數(shù)組。這也是遞歸算法的終結(jié)部分var base = Math.floor(arr.length / 2);//找到中間的基準元素位置var baseEle = arr[base];//把基準元素從arr中取出var left = [];var right = [];for (var i = 0; i < arr.length; i++) {if (i === base) continue;if (arr[i] < baseEle) {left.push(arr[i]);} else {right.push(arr[i]);}}return recursiveSort(left).concat([baseEle ], recursiveSort(right));//返回遞歸左右兩個部分concat中間元素,這就是結(jié)果 }; sortArr = recursiveSort1(arr);

這兩種方法會重新生成一個數(shù)組,并對其進行排序,并且執(zhí)行效率較高,代碼量比較小。但是法1會改變原數(shù)組(剔除原數(shù)組中間的一個元素),法2會保留原數(shù)組

總結(jié)

以上是生活随笔為你收集整理的原生js数组排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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