带你读《图解算法小抄》十四、排序(10)

简介: 带你读《图解算法小抄》十四、排序(10)

带你读《图解算法小抄》十四、排序(9)https://developer.aliyun.com/article/1348141?groupCode=tech_library


2快速排序的优化技巧

尽管快速排序是一种高效的算法,但在某些情况下,其性能可能有所下降。为了克服这些问题,我们可以使用以下优化技巧:

 

随机选择pivot

当数组已经有序时,选择中间位置的元素作为pivot会导致分割出的两个子数组大小差异很大,从而降低算法性能。为了解决这个问题,可以使用随机选择pivot的方法。通过随机选择pivot,可以减少特定情况下的不利影响,提高整体性能。

 

下面是在JavaScript中实现随机选择pivot的代码示例:

 

function getRandomPivot(arr, start, end) {
  const randomIndex = Math.floor(Math.random() * (end - start + 1)) + start;
  [arr[randomIndex], arr[end]] = [arr[end], arr[randomIndex]];
  return partition(arr, start, end);
}
function quickSortRandomPivot(arr, start = 0, end = arr.length - 1) {
  if (start < end) {
    const pivotIndex = getRandomPivot(arr, start, end);
    quickSortRandomPivot(arr, start, pivotIndex - 1);
    quickSortRandomPivot(arr, pivotIndex + 1, end);
  }
  return arr;
}

 三数取中法

快速排序的性能在某些特定情况下可能会下降,如当数组已经有序或接近有序时。为了解决这个问题,可以使用"三数取中法"来选择pivot。该方法从子数组的起始、中间和末尾位置选择三个元素,并将它们排序后选择中间的元素作为pivot。

 

function getMedianOfThree(arr, start, end) {
  const mid = Math.floor((start + end) / 2);
  if (arr[start] > arr[mid]) {
    [arr[start], arr[mid]] = [arr[mid], arr[start]];
  }
  if (arr[start] > arr[end]) {
    [arr[start], arr[end]] = [arr[end], arr[start]];
  }
  if (arr[mid] > arr[end]) {
    [arr[mid], arr[end]] = [arr[end], arr[mid]];
  }
  return mid;
}
function quickSortMedianOfThree(arr, start = 0, end = arr.length - 1) {
  if (start < end) {
    const pivotIndex = getMedianOfThree(arr, start, end);
    const pivot = arr[pivotIndex];
    let left = start;
    let right = end - 1;
    while (left <= right) {
      while (arr[left] < pivot) {
        left++;
      }
      while (arr[right] > pivot) {
        right--;
      }
      if (left <= right) {
        [arr[left], arr[right]] = [arr[right], arr[left]];
        left++;
        right--;
      }
    }
    [arr[left], arr[pivotIndex]] = [arr[pivotIndex], arr[left]];
    quickSortMedianOfThree(arr, start, left - 1);
    quickSortMedianOfThree(arr, left + 1, end);
  }
  return arr;
}

带你读《图解算法小抄》十四、排序(11)https://developer.aliyun.com/article/1348139?groupCode=tech_library

相关文章
|
6月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
343 5
|
6月前
|
机器学习/深度学习 运维 算法
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
355 0
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
|
7月前
|
机器学习/深度学习 算法 安全
【无人机3D路径规划】基于非支配排序遗传算法NSGAII的无人机3D路径规划研究(Matlab代码实现)
【无人机3D路径规划】基于非支配排序遗传算法NSGAII的无人机3D路径规划研究(Matlab代码实现)
290 1
|
6月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
242 0
|
6月前
|
机器学习/深度学习 算法 安全
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)
206 0
|
7月前
|
机器学习/深度学习 算法 安全
【优化调度】基于matlab非支配排序遗传算法求解车辆充电调度优化问题研究(Matlab代码实现)
【优化调度】基于matlab非支配排序遗传算法求解车辆充电调度优化问题研究(Matlab代码实现)
151 0
|
6月前
|
存储 算法 搜索推荐
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
专攻软考高频算法,深度解析二分查找、堆排序、快速排序核心技巧,对比九大排序算法,配套动画与真题,7天掌握45%分值模块。
289 1
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
|
6月前
|
供应链 算法 Java
【柔性作业车间调度问题FJSP】基于非支配排序的多目标小龙虾优化算法求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
【柔性作业车间调度问题FJSP】基于非支配排序的多目标小龙虾优化算法求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
243 1
|
7月前
|
传感器 并行计算 算法
【无人机编队】基于非支配排序遗传算法II NSGA-II高效可行的无人机离线集群仿真研究(Matlab代码实现)
【无人机编队】基于非支配排序遗传算法II NSGA-II高效可行的无人机离线集群仿真研究(Matlab代码实现)
506 3
|
6月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】基于非支配排序的鱼鹰优化算法NSOOA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】基于非支配排序的鱼鹰优化算法NSOOA求解无人机三维路径规划研究(Matlab代码实现)
154 0