数据结构与算法(Dart)之插入快速排序(十五)

是目前公认最佳的排序法。它选择一个基准元素, 其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

步骤为:

  • 从数列中挑出一个元素,称为"基准"(pivot)。

  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

时间复杂度

快速排序有两个方向,左边的i下标一直往右走(当条件a[i] <= a[center_index]时),其中center_index是中枢元素的数组下标,一般取为数组第0个元素。 在中枢元素和a[j]交换的时候,很有可能把前面的元素的稳定性打乱,比如序列为 5 3 3 4 3 8 9 10 11 现在中枢元素5和3(第5个元素,下标从1开始计)交换就会把元素3的稳定性打乱。 所以快速排序是一个不稳定的排序算法,不稳定发生在中枢元素和a[j]交换的时刻。

最坏情况, 需要进行n‐1递归调用,其空间复杂度为O(n), 平均情况为O(logn)。

scss 复制代码
/// 快速排序

quickSort(List<int> src) {
  _quickSort(src, 0, src.length - 1);
}

/// 快速排序
_quickSort(List<int> src, int leftIndex, int rightIndex) {
  // 如果左索引小于右索引,则递归地对数组进行快速排序
  if (leftIndex < rightIndex) {
    int p = _partition(src, leftIndex, rightIndex);

    _quickSort(src, leftIndex, p - 1); // 对基准元素左侧的子数组进行快速排序

    _quickSort(src, p + 1, rightIndex); // 对基准元素右侧的子数组进行快速排序
  }

  print("快速排序, src:$src \n");
}

// 定义一个名为 _partition 的函数,用于划分数组,并返回划分后的基准元素的索引位置
_partition(List<int> src, int left, int right) {
  // 选择中间位置的元素作为基准元素
  int p = (left + (right - left) / 2).toInt();

  // 交换基准元素和最右边的元素
  var temp = src[p];
  src[p] = src[right];
  src[right] = temp;

  // 初始化游标 cursor
  int cursor = left;

  // 遍历数组并根据基准元素将元素交换到左侧或右侧
  for (int i = left; i < right; i++) {
    if (cf(src[i], src[right]) <= 0) {
      // 如果当前元素小于等于基准元素,则交换它和游标位置的元素
      var temp = src[i];
      src[i] = src[cursor];
      src[cursor] = temp;
      cursor++;
    }
  }

  // 将基准元素放置在游标位置
  temp = src[right];
  src[right] = src[cursor];
  src[cursor] = temp;

  return cursor; // 返回基准元素的索引位置
}

// 比较函数,用于判断两个元素的大小关系
cf(int a, int b) {
  if (a < b) {
    return -1; // 若 a 小于 b,则返回 -1
  } else if (a > b) {
    return 1; // 若 a 大于 b,则返回 1
  } else {
    return 0; // 若 a 等于 b,则返回 0
  }
}

void main() {
  quickSort([36, 3, 4, 2, 1, 6, 5, 9, 7, 8, 10]);
}
相关推荐
Fine姐6 分钟前
数据挖掘3.6~3.10 支持向量机—— 核化SVM
算法·支持向量机·数据挖掘
野渡拾光2 小时前
【考研408数据结构-05】 串与KMP算法:模式匹配的艺术
数据结构·考研·算法
tainshuai4 小时前
用 KNN 算法解锁分类的奥秘:从电影类型到鸢尾花开
算法·分类·数据挖掘
Coovally AI模型快速验证9 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
pusue_the_sun9 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao3410 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
zhangfeng113310 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
啊阿狸不会拉杆11 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路11 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
你知道网上冲浪吗12 小时前
【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架
python·算法·数学建模·数值分析