美文网首页
使用JS实现排序的八种算法

使用JS实现排序的八种算法

作者: zzglovecoding | 来源:发表于2020-06-17 23:55 被阅读0次
//1.冒泡排序
//通过lastIndex减少外层循环,flag减少内层循环,平均时间复杂度为 O(n²) ,最坏时间复杂度为 O(n²) ,空间复杂度为 O(1) ,稳定排序
function bubbleSort(arr) {
    if (!Array.isArray(arr) || arr.length <= 1) return;
    let lastIndex = arr.length - 1;
    while(lastIndex > 0) {
        let flag = true,
        k = lastIndex;
        for(let i = 0;i < k;i++) {
            if (arr[i] > arr[i + 1]) {
                flag = false;
                lastIndex = i;
                [arr[i],arr[i + 1]] = [arr[i + 1],arr[i]];
            }
        }
        if (flag) break;
    }
}
let s = [1,6,8,3,6,2,3,9];
bubbleSort(s)
s


//2.选择排序
//选择排序的平均时间复杂度为 O(n²) ,最坏时间复杂度为 O(n²) ,空间复杂度为 O(1) ,不是稳定排序
function selectSort(arr) {
    if (!Array.isArray(arr) || arr.length <= 1) return;
    let length = arr.length;
    for(let i = 0;i < length - 1;i++) {
        let minIndex = i;
        for(let j = i + 1;j < length;j++) {
            if (arr[minIndex] > arr[j]) {
                minIndex = j;
            }
        }
        swap(arr,minIndex,i);
    }
}
function swap(arr,left,right) {
    let temp = arr[left];
    arr[left] = arr[right];
    arr[right] = temp;
}
let s = [1,6,8,3,6,2,3,9];
selectSort(s)
s


//3.插入排序
//平均时间复杂度为 O(n²) ,最坏时间复杂度为 O(n²) ,空间复杂度为 O(1) ,是稳定排序
function insertSort(arr) {
    if (!Array.isArray(arr) || arr.length <= 1) return;
    let length = arr.length;
    for(let i = 1;i < length;i++) {
        let j = i,
        temp = arr[i];
        while(j - 1 >= 0 && arr[j - 1] > temp) {
            arr[j] = arr[j - 1];
            j--;
        }
        arr[j] = temp;
    }
}
let s = [1,6,8,3,6,2,3,9];
insertSort(s)
s


//4.希尔排序
//总体小于n^2,平均时间复杂度为 O(nlogn) ,最坏时间复杂度为 O(n^s) ,空间复杂度为 O(1) ,不是稳定排序
function hillSort(arr) {
    if (!Array.isArray(arr) || arr.length <= 1) return;
    let length = arr.length;
    for(let gap = parseInt(length >> 1);gap > 0;gap = parseInt(gap >> 1)) {
        for(let i = gap;i < length;i++) {
            let temp = arr[i],
            j = i;
            while(j - gap >= 0 && arr[j - gap] > temp) {
                arr[j] = arr[j - gap];
                j -= gap;
            }
            arr[j] = temp;
        }
    }
}
let s = [1,6,8,3,6,2,3,9];
hillSort(s)
s


//归并排序
//平均时间复杂度为 O(nlogn) ,最坏时间复杂度为 O(nlogn) ,空间复杂度为 O(n) ,是稳定排序
function mergeSort(arr) {
    if (!Array.isArray(arr) || arr.length < 1) return;
    if (arr.length === 1) {
        return arr;
    }
    let length = arr.length;
    let midIndex = parseInt(length >> 1),
    leftArr = arr.slice(0,midIndex),
    rightArr = arr.slice(midIndex,length);

    return merge(mergeSort(leftArr),mergeSort(rightArr));
}
function merge(left,right) {
    let result = [],
    llength = left.length,
    rlength = right.length,
    il = 0,
    ir = 0;
    while(il < llength && ir < rlength) {
        if (left[il] < right[ir]) {
            result.push(left[il++]);
        }else {
            result.push(right[ir++]);
        }
    }
    while(il < llength) {
        result.push(left[il++]);
    }
    while(ir < rlength) {
        result.push(right[ir++]);
    }
    return result;
}
let s = [1,6,8,3,6,2,3,9];
let m = mergeSort(s)
m



//快速排序
//平均时间复杂度为 O(nlogn) ,最坏时间复杂度为 O(n²) ,空间复杂度为 O(logn) ,不是稳定排序 ,效率最高
function quickSort(arr,start,end) {
    if (!Array.isArray(arr) || arr.length < 1 ||start > end) return;
    let index = partition(arr,start,end);
    quickSort(arr,start,index - 1);
    quickSort(arr,index + 1,end);
}
function partition(arr,start,end) {
    let pivot = arr[start];
    while(start < end) {
        while(start < end && arr[end] >= pivot) {
            end--;
        }
        arr[start] = arr[end];
        while(start < end && arr[start] < pivot) {
            start++;
        }
        arr[end] = arr[start];
    }
    arr[start] = pivot;
    return start;
}
let s = [1,6,8,3,6,2,3,9];
quickSort(s,0,s.length - 1);
s


//堆排序
//构建大顶堆,交换位置实现排序,平均时间复杂度为 O(nlogn) ,最坏时间复杂度为 O(nlogn) ,空间复杂度为 O(1) ,不是稳定排序
function heapSort(arr) {
    if (!Array.isArray(arr) || arr.length <= 1) return;
    let length = arr.length;
    buildMaxHeap(arr);
    for(let i = length - 1;i >= 0;i--) {
        swap(arr,0,i);
        adjustMaxHeap(arr,0,i);
    }
}
function buildMaxHeap(arr) {
    let length = arr.length,
    iParent = parseInt(length >> 1) - 1;
    for(let i = iParent;i >= 0;i--) {
        adjustMaxHeap(arr,i,length);
    }
}
function adjustMaxHeap(arr,index,heapSize) {
    let iMax,
    iLeft,
    iRight;
    while(true) {
        iMax = index;
        iLeft = 2 * iMax + 1;
        iRight = 2 * iMax + 2;
        if (iLeft < heapSize && arr[iLeft] > arr[iMax]) {
            iMax = iLeft;
        }
        if (iRight < heapSize && arr[iRight] > arr[iMax]) {
            iMax = iRight;
        }
        if (iMax !== index) {
            swap(arr,iMax,index);
            index = iMax;
        }else {
            break;
        }
    }
}
function swap(arr,left,right) {
    let temp = arr[left];
    arr[left] = arr[right];
    arr[right] = temp;
}
let s = [1,6,8,3,6,2,3,9];
heapSort(s)
s


//基数排序
//非比较类排序算法,平均时间复杂度为 O(nk),k 为最大元素的长度,最坏时间复杂度为 O(nk),空间复杂度为 O(n) ,牺牲空间换速度,是稳定排序
function radixSort(arr) {
    if (!Array.isArray(arr) || arr.length <= 1) return;
    let max = arr[0],
    buckets = [],
    loop,
    length = arr.length;
    for(let i = 1;i < length;i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    loop = (max + '').length;
    for(let i = 0;i < 10;i++) {
        buckets[i] = [];
    }

    for(let i = 0;i < loop;i++) {
        for(let j = 0;j < length;j++) {
            let str = arr[j] + '';
            let length = str.length;
            if (length >= i + 1) {
                let k = parseInt(str[length - 1 - i]);
                buckets[k].push(arr[j]);
            }else {
                buckets[0].push(arr[j]);
            }
        }
        arr.splice(0,length);
        for(let i = 0;i < 10;i++) {
            let k = buckets[i].length;
            for(let j = 0;j < k;j++) {
                arr.push(buckets[i][j]);
            }
        }
    }
    return arr;
}
let s = [1,6,8,3,6,2,3,9];
let m = radixSort(s)
m

上述八种排序算法,快速排序的效率最高,前几种的时间复杂度全部趋近于O(n^2),堆排序,快速排序,归并排序的时间复杂度较低,三者中效率最高的是快速排序,由于缓存机制和操作有效性的区别,导致快速排序的效率最高

相关文章

  • 数组的排序算法的实现

    数组的排序算法 关于排序算法请看这篇文章。本文尝试使用js来实现一部分简单的算法。 选择排序 思路:若要从小到大排...

  • 算法

    算法和数据结构 十大排序实现原理?使用场景js中sort使用的是哪种排序?sort使用的是插入排序和快速排序结合的...

  • 前端算法学习-第一篇

    冒泡排序算法 冒泡排序算法是最慢的排序算法之一,也是最容易实现的排序算法。之所以叫冒泡排序是因为使用这种算法排序时...

  • 第三章:高级排序算法

    归并排序算法(mergeSort) 算法思想:Python使用函数实现: 自底向上的归并排序算法 算法思想:Pyt...

  • 7大经典的排序算法总结实现

    作者 : 专注J2EE来源 : 博客园 常见排序算法总结与实现 本文使用Java实现这几种排序。以下是对排序算法总...

  • JavaScript 实现多种排序算法

    本章将介绍 JavaScript 如何实现排序,几种排序算法介绍如下图: 准备工具函数 util.js 备用: 借...

  • 数据结构&算法(一)

    一、Java实现快速排序算法 二、Java实现折半插入排序算法 三、Java实现冒泡排序算法

  • 手撕代码 之 快速排序

    1.实现快速排序算法 问题描述给定一个无序数组int[ ] a,使用快速排序算法进行排序。 解题思路对于快速排序,...

  • 用JavaScript实现常见的排序算法

    前戏 复习了一些比较常见的排序算法,用JS实现,带一些实现思路。 无图,无脑贴代码。。 比较排序 冒泡排序 比较相...

  • 快速排序&快速排序与归并排序的对比

    快速排序算法 快速排序算法是从上到下解决问题使用递归实现,通过巧妙的方式,实现原地排序 分析时间复杂度O(nlog...

网友评论

      本文标题:使用JS实现排序的八种算法

      本文链接:https://www.haomeiwen.com/subject/nsxyxktx.html