原生js数组排序
原生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é)
- 上一篇: 自然语言之情感分析(中文)
- 下一篇: [51nod1264]线段相交