算法 ----- 排序算法&搜索算法

// 排序算法
function ArrayList() {    
    var array = [];    
    this.insert = function (item) {        
        array.push(item);    
    };
    this.toString = function (item) {        
        return array.join();    
    }
        
//冒泡    
    this.bubbleSort = function () {        
        var length = array.length;        
        for(var i = 0; i < length; i ++) {            
            for(var j = 0; j < length - 1; j ++) {                
                if(array[j] > array[j+1]) {                    
                    swap(array, j, j+1)                
                }               
            }        
        }    
    }    
    function swap(arr, index1, index2) {        
        var variable = arr[index1];        
        arr[index1] = arr[index2];        
        arr[index2] = variable;     
    }
    
//改进冒泡,减少内循环不必要的比较次数,每一轮最后两个数下一次没必要再比较    
    this.modifedBubbleSort = function() {        
        var length = array.length;        
        for(var i=0; i<length; i++) {            
            for(var j=0; j<length-1-i; j++) {                
                if(array[j] > array[j+1]) {                    
                    swap(array, j, j+1);                
                }            
            }        
        }    
    } 
   
//选择排序,每轮循环选出最小项的索引,将最小项依次排列    
    this.selection = function () {        
        var length = array.length,            
            indexMin;        
        for (var i=0; i<length-1; i++) {            
            indexMin = i;            
            for(var j=i; h; j++) {                
                if(array[indexMin] > array[j]) {                    
                    indexMin = j;                
                }            
            }            
            if(indexMin !== i) {                
                swap(array, indexMin, i)            
            }        
        }    
    }
    
//插入排序,假定第一位已经排好,第二位选择插入第一位之后还是之前        
    this.insertionSort = function () {        
        var length = array.length;        
        var j,  //记录当前索引            
        temp; //记录当前值        
        for (var i=1; i<length; i++) {            
            j = i;            
            temp = arrar[i];            
            while (j>0 && array[j-1] > temp) {                
                array[j] == array[j-1];//如果当前值的前一位大于当前值,
                                       //就把前一位赋值给当前位置                
                j--;              //然后继续向前判断,直到循环跳出,就找到j的合适位置                }            
            array[j] = temp;           //将之前储存的最初的值赋给j        
        }    
    }    

//归并排序 Firefox采用的是归并排序作为Array.prototype.sort()的方法实现,chrome采用的是另
//种方法,归并排序是一种分治算法,就是将数组分割成若干小数组,直到每个小数组只有一个成员,然后将 
//小数组合并成较大数组    
    this.mergeSort = function () {        
        array = mergeSortRec(array);    
    }    
    function mergeSortRec(arr) {        
        var length = arr.length;        
        if(length == 1) {            
            return arr;        
        }        
        var mid = Math.floor(length/2);        
        var left = arr.slice(0, mid);        
        var right = arr.slice(mid, length);        
        return merge(mergeSortRec(left), mergeSortRec(right))    
    }    
    function merge(left, right) {        
        var leftInd = 0,            
            rightInd = 0,            
            result = []        
        while(leftInd < left.length && rightInd < right.length) {            
            if(left[leftInd] < right[rightInd]) {                
                result.push(left[leftInd])                
                leftInd++;            
            }else {                
                result.push(right[rightInd]);                
                rightInd++;            
            }        
        }        
        while (leftInd < left.length) {            
            result.push(left[leftInd]);            
            leftInd++;        
        }        
        while (rightInd < right.length) {            
            result.push(right[rightInd]);            
            rightInd++;        
        }        
        return result;            
    }    

//快速排序,最常用之一,chrome里的sort实现(变形),也是采用分治的方法    
//将数组划分成小数组,但是没有分割开    
    this.quickSort = function () {        
        quick(array, 0, array.length - 1);    
    }    
    var quick = function (arr, left, right) {        
        var index;        
        if (arr.length > 1) {            
            index = partition(arr, left, right);//接收中间元            
            if (left < index - 1) {                
                quick(arr, left, index - 1);            
            }            
            if (index < right) {                
                quick(arr, index, right)            
            }        
        }    
    }    
    var partition = function (arr, left, right) {        
        var pivot = arr[Math.floor((right + left) / 2)], //中间元素为中间元                 i = left,            
        j = right;        
        while (i <= j) {            
            while (arr[i] < pivot) {                
                i++;            
            }            
            while (arr[j] > pivot) {                
                j--;            
            }            
            // if (i <= j) {            
            swap(arr, i, j);            
            i++;            
            j--;            
            // }        
        }        
        return i;    
    }

 //堆排序  首先,我们从最下面一层向上遍历,第一次buildHeap将每一个子数中最大的值给父节点    
    this.heapSort = function () {        
        var heapSize = array.length;        
        buildHeap(array);        
        while(heapSize) {            
            heapSize--;            
            swap(array, 0, heapSize);            
            heapify(array, heapSize, 0);        
        }    
    }    
    //先对数组进行二叉树的排序,先检查最左边子节点,其索引值一定是length的一半(如果二叉树是满树的话)    
    //比较左右子节点,大的放中间    
    function buildHeap(array) {        
        var heapSize = array.length;        
        for(var i = Math.floor(array.length / 2); i >= 0; i--) {            
            heapify(array, heapSize, i);        
        }    
    }    
    //比较左右子节点,大的放中间,然后递归,从最大的索引值向下继续查找    
    function heapify(array, heapSize, i) {        
        var left = i * 2 + 1,            
        right = i * 2 + 2,            
        largest = i;        
        if (left < heapSize && array[left] > array[largest]) {            
            largest = left;        
        }        
        if (right < heapSize && array[right] > array[largest]) {            
            largest = right;        
        }        
        if (largest !== i) {            
            swap(array, i, largest);            
            heapify(array, heapSize, largest)        
        }    
    }

    //搜索算法    
    // 1.顺序算法  ----   略,太低效        
    // 2.二分搜索,要求数据结构已排序    
    this.binarySearch = function (item) {        
        this.quickSort();        
        var low = 0,            
        height = array.length - 1,            
        mid,            
        element;        
        while (low <= height) {            
            mid = Math.floor((low + height) / 2);            
            element = array(mid);            
            if (element < item) {                
                low = mid + 1;            
            }else if (element > item) {                
                height = mid -1;            
            }else {                
                return mid;            
            }        
        }        
        return -1;    
    }
}复制代码



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值