javascript常用陣列排序及二分查詢
阿新 • • 發佈:2018-11-11
1. 氣泡排序 基本思路:依次比較相鄰的兩個數的大小,若大數在前、小數在後,則交換兩個數的位置,依次比較直至全部資料從小到大排好序
function sort_bubble(arr) { var len = arr.length; for (var i = 0; i < len; i++) { for (var j = 0; j < len - (i + 1); j++) { if (arr[j] > arr[j + 1]) { var temp = arr[j]; arr[j]= arr[j + 1]; arr[j + 1] = temp; } } } return arr; } var arr = [9,3,5,7,2,8]; console.log(sort_bubble(arr)); // [2, 3, 5, 7, 8, 9]
2. 選擇排序 基本思路:通過比較首先選出最小的數放在第一個位置上,然後在其餘的數中選出次小數放在第二個位置上,以此類推,直到所有的數成為有序數列。
functionsort_select(arr) { var len = arr.length, minIndex, temp; for (var i = 0; i < len - 1; i++) { minIndex = i; for (var j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } temp= arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } return arr; } var arr = [9,3,5,7,2,8]; console.log(sort_select(arr)); // [2, 3, 5, 7, 8, 9]
3. 快速排序 基本思路:將序列分成2部分,左邊放小數,右邊放大數,最後將左邊、中間、右邊連線起來。
function sort_quick(arr) { if (arr.length <= 1) { return arr; } var mid = Math.floor(arr.length/2), midNum = arr[mid], left = [], right = [], midArr = []; for (var i = 0; i < arr.length; i ++) { if (arr[i] < midNum) { left.push(arr[i]); } else if (arr[i] > midNum) { right.push(arr[i]); } else { midArr.push(arr[i]); } } return sort_quick(left).concat(midArr,sort_quick(right)); } var arr = [9,3,5,7,2,8]; console.log(sort_quick(arr)); // [2, 3, 5, 7, 8, 9]
4. 二分查詢(折半查詢),在從小到大排列的有序數列中查詢指定值的位置 基本思路:找到一箇中間值,通過與中間值比較,大的放右邊,小的放在左邊。再在兩邊中尋找中間值,持續以上操作,直到找到所在位置為止。
function find_fold(arr,target) { var low = 0,high = arr.length - 1; while (low <= high) { var mid = Math.floor((low + high) / 2); if (arr[mid] === target) { return mid; } if (target > arr[mid]) { low = mid + 1; } else { high = mid -1; } } return false; } var arr = [2,3,4,5,6]; console.log(find_fold(arr,5)); // 3