算法排序

2018-09-22  本文已影响0人  饥人谷_哈噜噜

非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。

线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。

算法分类.png

冒泡排序:高的往后排

function swap(array,a,b){
    var temp
    temp = array[a]
    array[a] = array[b]
    array[b] = temp
}
function sort(array){
    var i,j
    for(i = 0;i<array.length;i++){
        //排了第i次
        for(j=0;j<array.length-1-i;j++){
            if(array[j] <= array[j+1]){
            }else{
                swap(array,j,j+1)
            }
        }
    }
    return array
}
console.log(sort([3,5,6,2,5,2,4]))

每次最高的排最后

选择排序:每次选择最小的,最小的往前站

function swap(array,a,b){
    var temp
    temp = array[a]
    array[a] = array[b]
    array[b] = temp
}
function sort(array){
    var i,j,indexMin
    for(i=0;i<array.length;i++){
        indexMin = i
        for(j=i+1;j<array.length;j++){
            //找到最小值,将j的值赋给indexMin
            if(array[j] < array[indexMin]){
                indexMin = j
            }
        }
        swap(array,i,indexMin)
    }
    return array
}
console.log(sort([3,5,6,2,5,2,4]))

插入排序:扑克牌算法

归并排序:领导算法 最底层

快速排序:自私算法:前面比我矮。后面比我高

var times=0;
var quickSort=function(arr){ 
    //如果数组长度小于等于1无需判断直接返回即可
    if(arr.length<=1){
        return arr;
    }
    var midIndex=Math.floor(arr.length/2);//取基准点
    var midIndexVal=arr.splice(midIndex,1);//取基准点的值,splice(index,1)函数可以返回数组中被删除的那个数arr[index+1]
    var left=[];//存放比基准点小的数组
    var right=[];//存放比基准点大的数组
    //遍历数组,进行判断分配
    for(var i=0;i<arr.length;i++){
        if(arr[i]<midIndexVal){
            left.push(arr[i]);//比基准点小的放在左边数组
        }
        else{
            right.push(arr[i]);//比基准点大的放在右边数组
        }
        console.log("第"+(++times)+"次排序后:"+arr);
    }
    //递归执行以上操作,对左右两个数组进行操作,直到数组长度为<=1;
    return quickSort(left).concat(midIndexVal,quickSort(right));//连接数组
};
console.log(quickSort(arr));

随机快速排序法:比快排效率高一些

桶排序

桶排序的工作原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶分别排序
缺点:占内存

基数排序:

先从低位排序,然后收集,再慢慢高位排序,以此类推 基数排序.gif
// LSD Radix Sort 
var counter = [];
function radixSort(arr, maxDigit) {
    var mod = 10;
    var dev = 1;
    for (var i = 0; i < maxDigit; i++ , dev *= 10, mod *= 10) {
        for (var j = 0; j < arr.length; j++) {
            var bucket = parseInt((arr[j] % mod) / dev); 
            if (counter[bucket] == null) { 
                counter[bucket] = []; 
            }
             counter[bucket].push(arr[j]);
        } 
        var pos = 0; 
        for (var j = 0; j < counter.length; j++) { 
            var value = null; 
            if (counter[j] != null) { 
                while ((value = counter[j].shift()) != null) { 
                    arr[pos++] = value; 
                } 
            } 
        }
    } 
    return arr;
}
上一篇下一篇

猜你喜欢

热点阅读