1. 程式人生 > >javascript常用陣列排序及二分查詢

javascript常用陣列排序及二分查詢

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. 選擇排序 基本思路:通過比較首先選出最小的數放在第一個位置上,然後在其餘的數中選出次小數放在第二個位置上,以此類推,直到所有的數成為有序數列。

   function
sort_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