几种算法

2017-03-30  本文已影响0人  _july77

代码虽源自抄袭,自己重写时改了一下变量名,消化更好了_

冒泡排序(Bubble Sort)

1. 算法步骤

2. 动图演示

3. JavaScript 代码实现

function sort(arr){
    var len=arr.length;
    for(var i=0;i<len;i++){
        for(var j=0;j<len-1-i;j++){
            if(arr[j]>arr[j+1]){
                var temp=arr[j+1];
                arr[j+1]=arr[j];
                arr[j]=temp;
            }
            
        }
    }
    return arr;
}
console.log(sort([2,53,1,16,26]));

选择排序(selectionSort)

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

1. 算法步骤

2. 动图演示

function sort(arr){
    var len=arr.length;
    var minId,temp;
    for(var i=0;i<len-1;i++){
        minId=i;
        for(var j=i+1;j<len;j++){
            if(arr[j]<arr[minId]){
                minId=j;
            }
        }
        temp=arr[i];
        arr[i]=arr[minId];
        arr[minId]=temp;
    }
    return arr;
}
console.log(sort([2,5,3,1,4]));

插入排序

1. 算法步骤

2. 动图演示

3. JavaScript 代码实现

function sort(arr){
    var len=arr.length;
    var sortedId,sortingValue;
    for(var i=1;i<len;i++){
        sortedId=i-1;
        sortingValue=arr[i];
        while(sortedId>=0 && arr[sortedId]>sortingValue){
            arr[sortedId+1]=arr[sortedId];//排序好的依次往后顺移
            sortedId=sortedId-1;//
        }
        arr[sortedId+1]=sortingValue;//最后把在排序的值赋给已排好的顺下一位
    }
    return arr;
}
console.log(sort([2,10,3,1,4]));

归并排序(Merge sort)

1. 算法步骤

2. 动图演示

3. JavaScript 代码实现

function sort(arr){
    var len=arr.length;
    if(len<2){
        return arr;
    }
    var middle=Math.floor(len / 2),
        left=arr.slice(0,middle),
        right=arr.slice(middle);
    return merge(sort(left),sort(right));
}
function merge(left,right){
    var result=[];
    while(left.length && right.length){
        if(left[0]<=right[0]){
            result.push(left.shift());
        }else{
            result.push(right.shift());
        }
    }
    while(left.length)
        result.push(left.shift());
    while(right.length)
        result.push(right.shift());
    return result;
}
console.log(sort([2,5,4,9,10,8,1]))

快速排序

1. 算法步骤

2. 动图演示

3. JavaScript 代码实现

<!---表示还没弄很懂,乱啊乱--->
function quickSort(arr, left, right) {
    var len = arr.length,
    partitionIndex,
    left = typeof left != 'number' ? 0 : left,
    right = typeof right != 'number' ? len - 1 : right;
    
    if (left < right) {
        partitionIndex = partition(arr, left, right);
        quickSort(arr, left, partitionIndex-1);
        quickSort(arr, partitionIndex+1, right);
    }
     return arr;
}
function partition(arr, left ,right) {     // 分区操作
    var pivot = left,                      // 设定基准值(pivot)
    index = pivot + 1;
    for (var i = index; i <= right; i++) {
        if (arr[i] < arr[pivot]) {
            swap(arr, i, index);
            index++;
        }        
    }
    swap(arr, pivot, index - 1);
    return index-1;
}
function swap(arr, i, j) {
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
function partition2(arr, low, high) {
    let pivot = arr[low];
    while (low < high) {
        while (low < high && arr[high] > pivot) {
            --high;
        }
        arr[low] = arr[high];
        while (low < high && arr[low] <= pivot) {
            ++low;
        }
        arr[high] = arr[low];
    }
    arr[low] = pivot;
    return low;
}
function quickSort2(arr, low, high) {
    if (low < high) {
        let pivot = paritition2(arr, low, high);
        quickSort2(arr, low, pivot - 1);
        quickSort2(arr, pivot + 1, high);
    }
    return arr;
}
console.log(quickSort([5,4,2,1,3,99]));

借来同学一个快速排序,很简洁

快速排序又称为自私算法,它优先让每个元素找到自己所在的位置,每次排序都实现“比我大的都在我右边,比我小的都在我左边”而不去计较它们的位置关系。具体做法为:先找一个基准点(一般用第一个元素或者中间元素)然后数组被分为两部分,如果选定值比它小,放左边;比它大,放右边。然后进行反复比较,就可以实现效果。

function sort(array){
    if(array.length<=1){
        return array;
    }
    var len = Math.floor(array.length/2);
    var cur = array.splice(len,1);
    var left = [];
    var right = [];
    for(var i=0;i<array.length;i++){
        if(cur>array[i]){
            left.push(array[i]);
        }else{
            right.push(array[i]);
        }
    }
    return sort(left).concat(cur,sort(right));
}
上一篇 下一篇

猜你喜欢

热点阅读