快速排序算法的过程及JavaScript实现

排序算法(Sorting algorithm)是计算机科学最古老、最基本的课题之一。要想成为合格的程序员,就必须理解和掌握各种排序算法。

目前,最常见的排序算法大概有七八种,其中"快速排序"(Quicksort)使用得最广泛,速度也较快。它是图灵奖得主C. A. R. Hoare(1934--)于1960时提出来的。

"快速排序"的思想很简单,整个排序过程只需要三步:

  (1)在数据集之中,选择一个元素作为"基准"(pivot)。

  (2)所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。

  (3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

举例来说,现在有一个数据集{85, 24, 63, 45, 17, 31, 96, 50},怎么对其进行快速排序呢?

第一步,选择中间的元素45作为"基准"。(基准值可以任意选择,但是选择中间的值比较容易理解。)

第二步,按照顺序,将每个元素与"基准"进行比较,形成两个子集,一个"小于45",另一个"大于等于45"。

第三步,对两个子集不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

下面参照网上的资料(这里这里),用Javascript语言实现上面的算法

方法一:

/*
 * @Author: pzx
 * @Date: 2022-07-25 15:57:17
 * @LastEditors: pzx
 * @LastEditTime: 2022-07-25 18:24:44
 * @Description: 快速排序
 */
let quickSort =arr =>{
        //检查数组个数 小于等于1 返回
        if(arr.length<2){
            return  arr;
        }
        //选取基准 pivot 
        let pivotIndex = Math.floor(arr.length/2);
        //arr.splice(pivotIndex,1)  即删除arr中的基准元素 并返回删除的元素(基准元素不需要比较)
        //arr.splice(pivotIndex,1)[0]  拿到删除的pivot元素
        let pivot=arr.splice(pivotIndex,1)[0]
        //定义两个空数组 存放一左一右两个子集
        let left=[],right=[];
        //遍历数组 小于基准的元素放在left 大于基准的元素放在right里
        for(let i=0;i<arr.length;i++){
            if(arr[i]<pivot){
                left.push(arr[i]);
            }else{
                right.push(arr[i]);
            }
        }
        //递归 重复上述两步  直到所有子集只剩下一个元素
        return quickSort(left).concat([pivot],quickSort(right));
}

// 功能测试
const arr=[12,45,3,6,8]
const res=quickSort(arr);
console.info(res);//输出[ 3, 6, 8, 12, 45 ]

方法二:

let quickSort = (array, left, right) => {
  if (Array.isArray(array) && typeof left === 'number' && typeof right === 'number') {
    if (left < right) {
      let x = array[right], i = left - 1, temp;
      for (let j = left; j <= right; j++) {
        if (array[j] <= x) {
          i++;
          temp = array[i];
          array[i] = array[j];
          array[j] = temp;
        }
      }
      quickSort(array, left, i - 1);
      quickSort(array, i + 1, right);
    }
    return array;
  } else {
    return 'array is not an Array or left or right is not a number!';
  }
}

思路都是一样的,首先选取基准pivot ,将小于pivot元素放到pivot左边,大于pivot元素放到pivot右边,对左子列、右子列分别重复上述操作直到所有子列长度为1 快速排序完成~

算法分析

  • 最佳情况:T(n) = O(nlogn),快速排序最优的情况就是每一次取到的元素都刚好平分整个数组
  • 最差情况:T(n) = O(n²),最差的情况就是每一次取到的元素就是数组中最小/最大的,这种情况其实就是冒泡排序了(每一次都排好一个元素的顺序)
  • 平均情况:T(n) = O(nlogn)
  • 稳定性:不稳定

参考资料:阮一峰老师博客--快速排序的Javascript实现

                   Javascript实现七大排序算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值