JavaScript实现十大排序算法

简介: 冒泡排序的特点,是一个个数进行处理。第i个数,需要与后续的len-i-1个数进行逐个比较。快速排序,使用的是分治法的思想。通过选定一个数字作为比较值,将要排序其他数字,分为 >比较值 和 <比较值,两个部分。并不断重复这个步骤,直到只剩要排序的数字只有本身,则排序完成。

冒泡排序
排序的效果图

解法

当前解法为升序

冒泡排序的特点,是一个个数进行处理。第i个数,需要与后续的len-i-1个数进行逐个比较。

为什么是 len-i-1个数?
因为数组末尾的i个数,已经是排好序的,确认位置不变的了。
为什么确认位置不变,因为它们固定下来之前,已经和前面的数字都一一比较过了。

function bubbleSort(arr){

const len = arr.length;
for(let i = 0; i < len - 1; i++){
    for(let j = 0; j < len - i - 1; j++){
        if(arr[j] > arr[j+1]){
            const tmp = arr[j+1];
            arr[j+1] = arr[j];
            arr[j] = tmp;
        }
    }
}

return arr;

}
复制代码
快速排序
概要
快速排序,使用的是分治法的思想。
通过选定一个数字作为比较值,将要排序其他数字,分为 >比较值 和 <比较值,两个部分。并不断重复这个步骤,直到只剩要排序的数字只有本身,则排序完成。
效果图

解法
function quickSort(arr){

sort(arr, 0, arr.length - 1);
return arr;


function sort(arr, low, high){
    if(low >= high){
        return;
    }

    let i = low;
    let j = high;
    const x = arr[i]; // 取出比较值x,当前位置i空出,等待填入
    while(i < j){
        // 从数组尾部,找出比x小的数字
        while(arr[j] >= x && i < j){
            j--;
        }
        // 将空出的位置,填入当前值, 下标j位置空出
        // ps:比较值已经缓存在变量x中
        if(i < j){
            arr[i] = arr[j]
            i++;
        }

        // 从数组头部,找出比x大的数字
        while(arr[i] <= x && i < j){
            i++;
        }
        // 将数字填入下标j中,下标i位置突出
        if(i < j){
            arr[j] = arr[i]
            j--;
        }
        // 一直循环到左右指针i、j相遇,
        // 相遇时,i==j, 所以下标i位置是空出的
    }

    arr[i] = x; // 将空出的位置,填入缓存的数字x,一轮排序完成

    // 分别对剩下的两个区间进行递归排序
    sort(arr, low, i - 1);
    sort(arr, i+1, high);
}

}
复制代码
希尔排序
概要
希尔排序是一种插入排序的算法,它是对简单的插入排序进行改进后,更高效的版本。由希尔(Donald Shell)于1959年提出。
特点是利用增量,将数组分成一组组子序列,然后对子序列进行插入排序。
由于增量是从大到小,逐次递减,所以也称为缩小增量排序。
效果图

解法

注意点
插入排序时,并不是一个分组内的数字一次性用插入排序完成,而是每个分组交叉进行。

执行插入时,使用交换法
function shellSort(arr){

// 分组规则 gap/2 递减
for(let gap = Math.floor(arr.length/2); gap > 0; gap = Math.floor(gap/2)){
    for(let i = gap; i < arr.length; i++){
        let j = i;
        // 分组内数字,执行插入排序,
        // 当下标大的数字,小于 下标小的数字,进行交互
        // 这里注意,分组内的数字,并不是一次性比较完,需要i逐步递增,囊括下个分组内数字
        while(j - gap >= 0 && arr[j] < arr[j - gap]){
            swap(j, j-gap);
            j = j - gap;
        }
    }
}

return arr;

function swap(a, b){
    const tmp = arr[a];
    arr[a] = arr[b];
    arr[b] = tmp;
}

}
复制代码
执行插入时,使用移动法
function shellSort(arr){

for(let gap = Math.floor(arr.length/2); gap > 0; gap = Math.floor(gap/2)){
    for(let i = gap; i < arr.length; i++){
        let j = i;
        const x = arr[j]; // 缓存数字,空出位置

        while(j - gap >= 0 && x < arr[j-gap]){
            arr[j] = arr[j - gap]; // 将符合条件的数字,填入空出的位置
            j = j - gap;
        }
        arr[j] = x; // 最后,将缓存的数字,填入空出的位置
    }
}

return arr;

}
复制代码

相关文章
|
2月前
|
前端开发 JavaScript 算法
使用 JavaScript 数组方法实现排序与去重
【10月更文挑战第21天】通过灵活运用 `sort()` 方法和 `filter()` 方法,我们可以方便地实现数组的排序和去重。同时,深入理解排序和去重的原理,以及根据实际需求进行适当的优化,能够更好地应对不同的情况。可以通过实际的项目实践来进一步掌握这些技巧,并探索更多的应用可能性。
113 59
|
4月前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
4月前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
2月前
|
前端开发 JavaScript 索引
JavaScript 数组常用高阶函数总结,包括插入,删除,更新,反转,排序等,如map、splice等
JavaScript数组的常用高阶函数,包括遍历、插入、删除、更新、反转和排序等操作,如map、splice、push、pop、reverse等。
23 0
|
3月前
|
JavaScript 前端开发
用Javascript对二维数组DIY按汉语拼音的排序方法
用Javascript对二维数组DIY按汉语拼音的排序方法
|
4月前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
82 1
|
5月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
142 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
4月前
|
JavaScript
js实现模糊搜索和排序
js实现模糊搜索和排序
20 0
|
5月前
|
算法 JavaScript
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
84 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
|
5月前
|
算法 JavaScript
JS 【详解】二叉树(含二叉树的前、中、后序遍历技巧和算法实现)
JS 【详解】二叉树(含二叉树的前、中、后序遍历技巧和算法实现)
53 0