首页 > 其他分享 >js 实现快速排序

js 实现快速排序

时间:2022-09-03 16:23:11浏览次数:89  
标签:arr quickSort js base quick 排序 快速 left

// 快速排序
// 稳定性
// 快速排序是以两个游标(指针)双向遍历,当两个指针相遇则遍历结束,并将相遇位置与基准值进行交换,递归出口为左游标>=右游标
// 快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止,排序就结束了
function quickSort(arr) {
    let tmpArr = [...arr]; //复制数组
    return quick(tmpArr, 0, tmpArr.length - 1);
}
function quick(arr, i, j) {
    if (j - i <= 0) return; //说明数组只有一个值了
    let left = i,
        right = j;
    let base = left; //以左边第一个为基准值
    let center = arr[base];
    while (left < right) {
        //开始循环了
        //每次循环包括从右往左和从左往右
        while (left < right && center < arr[right]) {
            right--;
        }
        if (left < right) {
            //找到了,交换位置
            arr[base] = arr[right];
            arr[right] = center;
            base = right;
            left++;
        }
        while (left < right && center > arr[left]) {
            //找到了,交换位置
            left++;
        }
        if (left < right) {
            arr[base] = arr[left];
            arr[left] = center;
            base = left;
            right--;
        }
    }
    quick(arr, i, base - 1); //分别处理左右两侧了
    quick(arr, base + 1, j);
    return arr;
}
console.log(quickSort([6, 3, 7, 8, 2, 4, 0, 1, 6, 5]));
console.log(quickSort([1, 2, 3, 4, 5, 6, 7, 8, 9, 9]));


function quickSort( arr ) {
    if(arr.length <= 1) return arr;
    const num = arr[0];
    let left = [], right = [];
    for(let i = 1;i < arr.length; i++) {
        if(arr[i]<=num) left.push(arr[i]);
        else right.push(arr[i]);
    }
    return quickSort(left).concat([num],quickSort(right));
}
console.log(quickSort([6, 3, 7, 8, 2, 4, 0, 1, 6, 5]));
console.log(quickSort([1, 2, 3, 4, 5, 6, 7, 8, 9, 9]));

参考链接:

https://www.imooc.com/article/73247

https://blog.csdn.net/xinxxxxxxxxx/article/details/123032933

标签:arr,quickSort,js,base,quick,排序,快速,left
From: https://www.cnblogs.com/beileixinqing/p/16652895.html

相关文章

  • 说说 JS 的事件循环机制 ?
    执行js代码时,遇到同步任务,直接推入调用栈执行,遇到异步任务,将该任务挂起,等到有返回结果后放到任务队列中;当调用栈中的任务全部执行完成后,这时开始事件循环(Eventloo......
  • 饮冰三年-人工智能-Pandas-78-Pandas 新增、统计、排序
    上一篇:饮冰三年-人工智能-Pandas-77-Pandas数据查询 数据准备可参考:饮冰三年-人工智能-Django淘宝拾遗-75-数据准备一、新增数据列1.1直接赋值#1:直接赋值(将性别......
  • 信息学奥赛一本通 1185:单词排序
    时间限制:1000ms      内存限制:65536KB提交数:20423   通过数:10401【题目描述】输入一行单词序列,相邻单词之间由1个或多个空格间隔,请按照字典......
  • 排序算法整理(包括初赛)
    排序算法整理常见考点将一个乱掉的字符串排回有序(以交换为基本操作)的最少操作,就是冒泡排序。排序算法的稳定性排序算法的时间复杂度排序算法的稳定性稳定性是指排......
  • 信息学奥赛 1181:整数奇偶排序
    时间限制:1000ms      内存限制:65536KB提交数:23930   通过数:15560【题目描述】给定10个整数的序列,要求对其重新排序。排序要求:1.奇数在前,偶......
  • 信息学一本通 1178:成绩排序
    时间限制:1000ms      内存限制:65536KB提交数:48847   通过数:20113【题目描述】给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出......
  • Python 博客园快速备份脚本
    鉴于有些小伙伴在寻找博客园迁移到个人博客的方案,本人针对博客园实现了一个自动备份脚本,可以快速将博客园中自己的文章备份成Markdown格式的独立文件,备份后的md文件可以直......
  • JS对后端响应的long类型数据处理精度丢失问题
    1、数据库的数据2、前端拿到的数据前端帮我们进行四舍五入了,这并不是我想要的3、解决办法把后端响应的数据long类型转成string类型,可以使用Stream流的方式或者for循......
  • 分页limit和排序order by
    --排序:升序ESC,降序DESC--orderby通过哪个字段来排序,怎么排--查询的结果根据成绩降序排序SELECTs.studentNo,studentName,subjectName,studentResu......
  • 快速浏览教材
    问题一、计算工具和计算学科有什么区别二、计算机为什么采用二进制?三、光栅图形与矢量图形有什么区别?四、门具体代表了什么?五、什么情况下会使用并行计算六、机器语......