本文實例講述了JS實現常見的查找、排序、去重算法。分享給大家供大家參考,具體如下:
今天總結了下排序簡單的算法
【自定義排序】
先尋找一個最小的數,然后依次那這個數和數組中其他數字比較,如果發現比這個數字小的數就把這兩個數調換位置,然后再繼續尋找下一個最小的數字進行下一輪比較
var arr = [31, 6, 19, 8, 2, 3];function findMin(start, arr) { var iMin = arr[start]; var iMinIndex = start; for (var i = start + 1; i < arr.length; i++) { if (arr[i] < iMin) { iMin = arr[i]; iMinIndex = i; } } return iMinIndex;}function sort1(arr) { for (var i = 0; i < arr.length; i++) { var iMinIndex = findMin(i, arr); var car; car = arr[i]; arr[i] = arr[iMinIndex]; arr[iMinIndex] = car; } return arr;}document.write(sort1(arr));【線性查找】:一個一個去查找
//不重復 有序var arr = [0];for (var i = 1; i < 100000; i++) { arr[i] = arr[i - 1] + Math.floor(Math.random() * 4 + 1);}function find1(n, arr) { for (var i = 0; i < arr.length; i++) { if (arr[i] == n) { return true; } } return false;}//測試性能var t1 = new Date().getTime();for (var i = 0; i < 10000; i++) { var n = Math.random() * 10000; find2(n, 0, arr.length - 1)}alert(new Date().getTime() - t1);【二分查找】:不停的分成兩個部分,分部分查找
是一種萬能方法,不一定是最好的,但是個保底的方法。(分治法)
***中間值 相加除以二,統一偏左,向下取整
//不重復 有序var arr = [12, 17, 23, 34, 45, 76, 89];function find2(n, s, e) { //邊界處理 if (s > e) { return false; } else if (s == e) { if (arr[s] == n) { return true; } else { return false; } } var c = Math.floor((s + e) / 2); if (arr[c] == n) { return true; } else { if (n < arr[c]) { return find2(n, s, c); } else { return find2(n, c + 1, e); } }}alert(find2(34, 0, arr.length - 1)); //true false【邊界處理】-----遞歸,一層一層往下找
//要求數組不重復有順序/var arr = [12, 23, 34, 45, 56, 67, 78]function find2(n, s, e) { if (s > e) { return fasle; } else if (s == e) { if (arr[s] == e) { return true; } else { return false; } } var c = Math.floor((s + e) / 2); if (arr[c] == n) { return true; } else { if (n < arr[c]) { return find2(n, s, c); } else { return find2(n, c + 1, e); } }}alert(find2(12, arr.length + 1, 78));應用
【查找最小值】
var arr = [12, 54, 32, 9, 5, 3, 1, 101, -100, -1000];function findMin(s, e) { if (s > e) { return []; } else if (s == e) { return arr[s]; } else if (s == e - 1) { if (arr[s] < arr[e]) { return arr[s]; } else { return arr[e]; } } var c = Math.floor((s + e) / 2); var l = findMin(s, c); var r = findMin(c + 1, e); if (l < r) { return l; } else { return r; }}alert(findMin(0, arr.length - 1));
新聞熱點
疑難解答
圖片精選