js实现规范的快排

前言

js写快排并不难 但是网上很多js版本的快排并不规范

错误示例1

function test(nums){
    if(nums.length <= 1) return nums; 
    let left = [],right = [];
    let target = nums[0];
    for(let i=1;i<nums.length;i++){
        if(nums[i]>target) right.push(nums[i])
        if(nums[i]<=target) left.push(nums[i])
    }
    // left.push(target);
    return test(left).concat(target).concat(test(right));
}
let nums = [3,2,2,1,4];
let res = test(nums);

如上所示 上述快排看上去貌似没问题 但是实质上违背了快排的原则 快排的本质是交换 但是上述代码并没有体现出交换,因此并不规范

错误示例2

/**
 * @author vigdxx@gmail.com
 * @param {Array} arr 待排序数组
 */
 function quickSort(arr) {
    /**
     * @description 对数组的一部分进行排序,快排的基准为取待排序部分首项
     * @param {Number} i  待排序部分开始位置
     * @param {Number} j 待排序部分结束位置
     */
    function sort(i,j) {
        // if(i >= j) {return} // 递归出口 
        // let start = i;
        // let end = j;

        if(i>=j) return;
        let start = i;
        let end = j;

        while(i < j) {
            for(;j>i;j--) {
                if(arr[i] > arr[j]) {
                    [arr[j],arr[i]] = [arr[i],arr[j]];
                    break;
                } 
            }
            // 这个地方用 ++i,可以少一次比较
            for(;i<j;i++) {
                if(arr[i] > arr[j]) {
                    [arr[j],arr[i]] = [arr[i],arr[j]];
                    break;
                } 
            }
        }
        // 此时 i == j , arr[i] 左边的小于等于 arr[i],右边的大于arr[i]
        sort(start,i-1);
        sort(i+1,end)
    }
    sort(0,arr.length - 1);
    return arr;
}
let arr = [ 30, 6, 78, 20, 1, 90 ];
console.log(quickSort(arr));

上述代码貌似也没有问题 但是确没有体现出枢纽,快排算法的第一步就是确定枢纽;

规范的快排

/**
 * @author vigdxx@gmail.com
 * @param {Array} arr 待排序数组
 */
 function quickSort(arr) {
    /**
     * @description 对数组的一部分进行排序,快排的基准为取待排序部分首项
     * @param {Number} i  待排序部分开始位置
     * @param {Number} j 待排序部分结束位置
     */
    function sort(i,j) {
        if(i >= j) {return} // 递归出口 
        let start = i;
        let end = j;
        let privot = arr[start];
        while(i < j) {
            while(i<j&&arr[j]>=privot) j--;
            arr[i] = arr[j];
            while(i<j&&arr[i]<=privot) i++;
            arr[j] = arr[i];
        }
        arr[i] = privot;
        sort(start,i-1);
        sort(i+1,end)
    }
    sort(0,arr.length - 1);
    return arr;
}
let arr = [ 30, 6, 78, 20, 1, 90 ];
console.log(quickSort(arr));

上述是笔者用js实现的快排 既体现了枢纽 又体现出了交换的思想;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序是一种常用的排序算法,它在性能上比冒泡排序和选择排序要好。快速排序不仅在实际应用中被广泛使用,而且在前端面试中也经常被提及。下面是一个用JavaScript实现快速排序的代码: ```javascript Array.prototype.quickSort = function() { const rec = (arr) => { if(arr.length <= 1) return arr; let left = []; let right = []; const base = arr < base) { left.push(arr[i]); } else { right.push(arr[i]); } } return [...rec(left), base, ...rec(right)]; } const res = rec(this); res.forEach((item, key) => { this[key = item; }); } const arr = [1, 5, 9, 3, 18, 6, 2, 7]; arr.quickSort(); console.log(arr); ``` 这段代码通过Array的原型链添加了一个quickSort方法,将快速排序算法应用于数组。具体实现思路如下: 1. 定义一个递归函数rec,用于对数组进行切割和排序。 2. 若数组长度小于等于1,则直接返回数组。 3. 设置左右两个空数组,取第一个元素为基准值base。 4. 遍历数组,将小于基准值的元素放入左数组,将大于等于基准值的元素放入右数组。 5. 递归调用rec函数对左右数组进行排序,并使用扩展运算符(...)将结果与基准值合并成一个新的数组。 6. 将排序后的结果覆盖原数组中的元素。 7. 最后通过调用arr.quickSort()对数组进行快速排序,并输出结果。 这段代码的时间复杂度为O(n log n),其中n是数组的长度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JavaScript实现快速排序算法](https://blog.csdn.net/Yolanda_NuoNuo/article/details/119243593)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Javascript快速排序算法详解](https://download.csdn.net/download/weixin_38614484/13608187)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值