js实现经典算法

1.选择排序

时间复杂度:O(n²)

算法原理:
在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

实现代码:

function sort(arry,type){
        var type=type || "asc";//默认升序
        for (var i = 0,l=arry.length; i<l; i++) {
            var minIndex=i;    //记录最值的下标
            var temp;
            for(var j=i+1;j<l;j++){
                if(type=='asc'){
                    if(arry[j]<arry[minIndex]){
                        minIndex=j;
                    }
                }else{
                    if(arry[j]>arry[minIndex]){
                        minIndex=j;
                    }
                }

            }
            //
            temp = arry[i]; 
            arry[i] = arry[minIndex]; 
            arry[minIndex] = temp; 
        }
        return arr; 
    }
   var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52]; 
console.log(sort(arr,"aa")); 

优点
稳定,无论什么数据进去都是O(n²)的时间复杂度
适用情形:
数据量越小越好

2.插入排序

时间复杂度:O(n²)

算法原理:
插入排序算法有种递归的思想在里面,它由N-1趟排序组成。初始时,只考虑数组下标0处的元素,只有一个元素,显然是有序的。

然后第一趟 对下标 1 处的元素进行排序,保证数组[0,1]上的元素有序;

第二趟 对下标 2 处的元素进行排序,保证数组[0,2]上的元素有序;

…..

…..

第N-1趟对下标 N-1 处的元素进行排序,保证数组[0,N-1]上的元素有序,也就是整个数组有序了。

它的递归思想就体现在:当对位置 i 处的元素进行排序时,[0,i-1]上的元素一定是已经有序的了。

实现代码:


    function sort(arry){
        for (var i = 1,l=arry.length; i<l; i++) {
            //寻找元素arry[i]的合适插入的位置
            for(var j=i;j>0;j--){
                if(arry[j] < arry[j-1]){
                    var temp=arry[j];
                    arry[j]=arry[j-1];
                    arry[j-1]=temp;
                }else{
                    break;
                }
            }
        }
        return arry; 
    }
var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52]; 
console.log(sort(arr,"aa")); 

优化
上述代码因为存在频繁的交换位置,所以存在性能问题。

function sort(arry){
        for (var i = 1,l=arry.length; i<l; i++) {
            //寻找元素arry[i]的合适插入的位置
            var current=arry[i];
            var j;
            for(j=i;j>0&&arry[j-1] > current;j--){
                arry[j]=arry[j-1];
            }
            arry[j]=current;
        }
        return arry; 
    }

或者

function insertionSort(arr) {
    var len = arr.length;
    var preIndex, current;
    for (var i = 1; i < len; i++) {
        preIndex = i - 1;
        current = arr[i];
        while(preIndex >= 0 && arr[preIndex] > current) {
            arr[preIndex+1] = arr[preIndex];
            preIndex--;
        }
        arr[preIndex+1] = current;
    }
    return arr;
}

适用情形:
如果数据大体是有序的,使用插入排序是非常合适的。

待续

猜你喜欢

转载自blog.csdn.net/css_666/article/details/79217643