快速排序,js实现

news/2024/5/19 21:29:01 标签: 算法, 快速排序, js
快速排序:指定基准数,把小于基准数放基准数左侧,把大于基准数的放右侧。根据当前规则完成一次排序后,对基准数左右两边的数据在重复上述规则排序,直至所有数据排序完成。
下面是根据个人理解画的示意图,有误解或有改进的地方望大佬们指点一二。
  1. 该示例中基准数定义为数组查找范围的中间项。红色标记基准数。在这里插入图片描述
  2. 第一次查找:左指针从数组第一项开始向右查找,找到大于基准数停止。右指针从数组最后一项向左查找,找到小于基准数停止。查找完成,交换左指针与右指针所在位置的值。
    在这里插入图片描述
  3. 第二次查找:左指针从上一次的位置继续查找,没有找到大于基准数的值,指针到基准数位置停止。右指针也从上一次的位置继续查找,找到小于基准数停止。查找完成,交换左指针与右指针所在位置的值。因为左指针和基准数重叠,交换后,基准数位置更新到同右指针位置一致。
    在这里插入图片描述
  4. 第三次查找:左右指针重复上述查找。查找完成,交换左右指针位置的值。因为右指针和基准数重叠,交换后,基准数位置更新到同左指针位置一致。
    在这里插入图片描述
  5. 第四次查询:左右指针和基准数重叠,从下图可以看出当前已经完成基准数左侧全小于,基准数右测全大于。
    在这里插入图片描述
  6. 根据基准数位置拆分,把左侧数据和右测数据分别重复上述过程。当进行排序的数据范围起始值大于等于结束值时,说明当前范围小于两条数据,无需排序,排序完成。
    在这里插入图片描述
代码实现
var arr1 = new Array(100);  
for(var i = 0; i< arr1.length - 1; i++){
    arr1[i] = parseInt(Math.random() * 100));
}
var arr = [2, 11, 5, 8, 13, 10, 7, 4];      
var quickSort = function (arr){
    function _quickSort(arr, start, end){
        //开始索引大于或等于结束索引时结束
        if(start >= end){
            return;
        }
        var left = start;
        var right = end;
        var flag = Math.floor((left + right)/2);
        while(left < right){
            //找到左侧大于基准数的索引
            while(left < flag && arr[left] <= arr[flag]){
                left ++;
            }
            //找到右测小于基准数的索引
            while(right > flag && arr[right] >= arr[flag]){
                right --;
            }
            //左位等于右位,说明left == right == flag,左侧全小于,右测全大于,基于当前基准数排序完成。
            if(left == right){
                continue;
            }
            var itme = arr[left];
            arr[left] = arr[right];
            arr[right] = itme;
            if(left == flag){//左位等于基准数时,交互位置后基准值索引更新到右位索引
                flag = right;
            }else if(right == flag){//右位等于基准数时,交互位置后基准值索引更新到左位索引
                flag = left;
            }
        }
        //对基准数左侧继续排序。
        _quickSort(arr, start, flag - 1);
        //对基准数右测继续排序。
        _quickSort(arr, flag + 1, end);
    }
    _quickSort(arr, 0, arr.length - 1);
}
quickSort(arr)
quickSort(arr1) 

http://www.niftyadmin.cn/n/565115.html

相关文章

webapi实现AJAX多文件上传,WebApi实现Ajax模拟Multipart/form-data方式多文件上传

前端页面代码&#xff1a;上传$(document).ready(function () {$("#btnUpload").click(function () {var formdata new FormData();var files $(".file_control");$.each(files, function (index, domEle) {formdata.append("file" index, do…

AJAX框架衣柜收纳技巧,如何收纳整理衣服方便省事又不会乱——一用就爱上的衣柜整理法...

自怀孕起&#xff0c;就有教会的朋友陆续送我宝宝的衣服&#xff0c;再加上其他亲友赠送的&#xff0c;真是多到满溢&#xff0c;宝宝一岁前还能与我共用一个衣橱&#xff0c;但衣服实在太多&#xff0c;四个折叠帆布收纳箱都容纳不了了&#xff0c;大的小的、长的短的、半身的…

学习记录:centerOS下安装 mongoDB

linux centerOS下安装 mongoDB 1.下载安装包 # curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.18.tgz 下载太慢使用下面百度网盘链接下载。在上传到服务器 链接&#xff1a;https://pan.baidu.com/s/1StmlpsjHK2D9GVY2ta1SdQ 提取码&#xff1a;cexf…

element-ui table 多列组合排序

element-ui table 多列组合排序element-ui table 配合后端实现多列组合排序。 思路&#xff1a; 1.监听sort-change事件&#xff0c;在该事件中缓存和修正当前的排序规则。并根据保存的排序规则调接口刷新表格数据。 2.监听header-cell-class-name事件&#xff0c;在该事件中修…

axios封装。实现token自动刷新,统一异常处理

axios封装。实现token自动刷新&#xff0c;统一异常处理 axios封装 //request.js import axios from axios import { Message } from element-ui import store from /store //vuex仓库 import errorCode from ./errorCode // 异常状态码说明配置 import {getToken, getToke…

elementUI 表格合并单元格-多层级-合并行

elementUI 表格合并单元格-多层级-合并行 需求&#xff1a;使用vue elementUI 实现如下表格&#xff1a; 省份城市区域人口贵州遵义汇川区100红花岗区100播州区100贵阳南明区100云岩区100安顺西秀区100平坝区100开发区100铜仁万山区100广东深圳南山区100 实现: html部分 …

搭建 Vite + Vue 3 + Typescript + tsx + less 项目

搭建 Vite Vue 3 Typescript tsx less 项目 项目地址: https://github.com/DuXiaoHeng/vue3-tsx 1. 使用vite脚手架 初始化一个 Vue 3 Typescript 项目 文档&#xff1a; 搭建第一个vue项目 npm init vitejs/app [项目名] --template vue-ts2. 配置tsx支持 文档&#xf…

使用qrcodejs和jimpjs两个库实现给图片加二维码水印

引入需要的库 QRCode.js 是一个用于生成二维码的 JavaScript 库。主要是通过获取 DOM 的标签,再通过 HTML5 Canvas 绘制而成,不依赖任何库。jimp.js 一个完全用 JavaScript 编写的 Node 图像处理库&#xff0c;零原生依赖。也可用于浏览器端 <script type"text/javas…