標籤:lse i++ else 成長 開發人員 code 遞增 floor 社區
快排和二分尋找都基於一種叫做「分治」的演算法思想,通過對資料進行分類處理,不斷降低數量級,實現O(logN)(對數層級,比O(n)這種線性複雜度更低的一種,快排核心是二分法的O(logN),實際複雜度為O(N*logN))的複雜度。
快速排序
快排大概的流程是:
- 隨機播放數組中的一個數 A,以這個數為基準
- 其他數字跟這個數進行比較,比這個數小的放在其左邊,大的放到其右邊
- 經過一次迴圈之後,A 左邊為小於 A 的,右邊為大於 A 的
- 這時候將左邊和右邊的數再遞迴上面的過程
const Arr = [85, 24, 63, 45, 17, 31, 96, 50];function quickSort(arr) { if (arr.length <= 1) { return arr; } let pivotIndex = Math.floor(arr.length / 2); let pivot = arr.splice(pivotIndex, 1)[0]; let left = []; let right = []; for (let i = 0; i < arr.length; i++) { if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } // 遞迴 return quickSort(left).concat([pivot], quickSort(right));}console.log(quickSort(Arr));...https://juejin.im掘金 — 一個協助開發人員成長的社區二分尋找
二分尋找法主要是解決「在一堆有序的數中找出指定的數」這類問題,不管這些數是一維數組還是多維陣列,只要有序,就可以用二分尋找來最佳化。
二分尋找是一種「分治」思想的演算法,大概流程如下:
- 數組中排在中間的數字 A,與要找的數字比較大小
- 因為數組是有序的,所以: a) A 較大則說明要尋找的數字應該從前半部分尋找 b) A 較小則說明應該從尋找數位後半部分尋找
- 這樣不斷尋找縮小數量級(扔掉一半資料),直到找完數組為止
題目:在一個二維數組中,每一行都按照從左至右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
function Find(target, array) { let i = 0; let j = array[i].length - 1; while (i < array.length && j >= 0) { if (array[i][j] < target) { i++; } else if (array[i][j] > target) { j--; } else { return true; } } return false;}//測試案例console.log(Find(10, [ [1, 2, 3, 4], [5, 9, 10, 11], [13, 20, 21, 23] ]));...https://juejin.im掘金 — 一個協助開發人員成長的社區
快速排序和二分尋找