js数组的冒泡排序, 选择排序, 以及快速排序

简介: js数组的冒泡排序, 选择排序, 以及快速排序
// 对于数组的排序
var arr = [4, 1, 2, 5, 3, 7, 6, 9, 0, 8];
// 冒泡排序
// 冒泡排序的思想在于,数组中的两两相互对比,大小的顺序调换位置
// 排序的意思是先比较,后交换位置
/**
 * 比较两个数字的大小
 * @param a {Number} 第一个数字
 * @param b {Number} 第二个数字
 * @returns {boolean}
 */
function compare(a, b) {
    return a > b;
}
/**
 * 交换数组中的位置
 * @param arr 数组
 * @param a 第一个位置
 * @param b 第二个位置
 */
function exchange(arr, a, b) {
    var temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}
/**
 * 冒泡排序: 每一圈可以得出一个最大值或者最小值, 冒泡排序适合用于数据结构不怎么乱的,也就是说数组的顺序完整性比较好的
 * @param arr
 */
function popSort(arr) {
    if (arr.length === 0) return
    // 第一圈循环 总共需要比较的次数
    for (var i = 0; i < arr.length; i++) {
        // 第二圈循环得出最大值或者最小值, 减i的原因是因为上一圈已经得出了一个最大或者最小值
        for (var j = 0; j < arr.length - 1 - i; j++) {
            if (compare(arr[j], arr[j + 1])) {
                exchange(arr, j, j + 1);
            }
        }
    }
}
// popSort(arr);
// console.log(arr);
// 选择排序
function chooseSort(arr) {
    // 算法的完整性,代码绝对不允许报错
    if (arr.length === 0) return
    // 第一圈循环总共需要的排序次数
    for (var i = 0; i < arr.length; i++) {
        // 第二圈用于选择最大,放到右边
        var maxIndex = 0;
        for (var j = 0; j < arr.length - i; j++) {
            if (compare(arr[j], arr[maxIndex])) {
                maxIndex = j;
            }
        }
        exchange(arr, maxIndex, arr.length - 1 - i)
    }
}
// chooseSort(arr);
// console.log(arr);
/**
 * 快速排序 简化版 只是用于理解快速排序,不太建议用于大数据的实战,每一个递归创建数组,浪费空间
 * @param arr {Array} 需要排序的数组
 */
function simpleQuickSort(arr) {
    // 算法中,这一行容错机制不能没有,因为算法不可以报错
    if (arr == null || arr.length === 0) return []
    // 分成两个部分
    var left = [], right = [];
    // 选取参照物
    var leader = arr[0];
    // 注意这里是从1开始
    for (var i = 1; i < arr.length; i++) {
        if (arr [i] > leader) {
            right.push(arr[i]);
        } else {
            left.push(arr[i]);
        }
    }
    left = simpleQuickSort(left);
    right = simpleQuickSort(right);
    // 把0那个数给拼接上
    left.push(leader);
    // 返回排好序的数据
    return left.concat(right);
}
// console.log(simpleQuickSort(arr));
/**
 * 数组的快速排序
 * @param arr {Array} 需要排序的数组
 * @param begin {Number} 开始位置
 * @param end {Number} 结束位置
 */
function complexQuickSort(arr, begin, end) {
    // 如果左边的下标大于右边的下标 直接结束
    if (begin >= end - 1) return
    // 获取左侧的开始下标, 右侧开始下标, 以及参照物
    var left = begin, right = end;
    do {
        // 当左侧参照物的值小于的时候,直接移动右边
        do {
            left++
        } while (arr[left] < arr[begin] && left < right);
        do {
            right--
        } while (arr[right] > arr[begin] && left < right);
        // 如果左侧参照物的值大于参照物,并且右侧的小于参照物,则交换位置
        if (left < right) {
            exchange(arr, left, right);
        }
    } while (left < right);
    // 获取第二个参照物的下标
    var swapPoint = left === right ? right - 1 : right;
    exchange(arr, begin, swapPoint);
    complexQuickSort(arr, begin, swapPoint);
    complexQuickSort(arr, swapPoint + 1, end);
}
complexQuickSort(arr, 0, arr.length);
console.log(arr)
相关文章
|
9月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
9月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
自然语言处理 前端开发 JavaScript
🛠️ JavaScript数组操作指南:20个精通必备技巧🚀
本文详细介绍了 JavaScript 中的 20 个高效数组操作技巧,涵盖了从基本的添加、移除元素,到数组转换和去重等高级操作。强调了不可变性的重要性,提供了清晰的代码示例,帮助开发者编写更整洁和高效的代码。无论是新手还是经验丰富的开发者,这些技巧都将显著提升您的编码能力,使您在项目中更具竞争力。
229 2
|
JavaScript 前端开发 测试技术
JS都有哪些操作数组的方法
JS都有哪些操作数组的方法
423 3
|
JavaScript
js删除数组中已知下标的元素
js删除数组中已知下标的元素
375 4
|
JavaScript 前端开发 Java
【javaScript数组,函数】的基础知识点
【javaScript数组,函数】的基础知识点
122 5
|
缓存 JavaScript 前端开发
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
183 1
|
JavaScript 前端开发 索引
探索JavaScript数组:基础
探索JavaScript数组:基础
95 3
|
JavaScript 前端开发 索引
JS 删除数组元素( 5种方法 )
JS 删除数组元素( 5种方法 )
805 1
|
JavaScript 前端开发
如何在JS中声明一个数组
如何在JS中声明一个数组
282 0

热门文章

最新文章