当前位置: 首页 > news >正文

10.1 快速排序(排序(下))

快速排序

文章目录

  • 快速排序
    • 10.1 基础概念
    • 10.2 代码实现
    • 10.3 内容补充

10.1 基础概念

算法过程:

  1. 在数据中挑选主元
  2. 将数据分成两个子列,小于主元的数据位于左子列,大于主元的数据位于右子列
  3. 再对左子列和右子列分别递归调用,直至仅剩一个数据

网图,侵删

伪代码描述:

void quick_sort(element_type A[], int N)
{if (N < 2) return;	//如果只有一个元素,returnpivot = 从A[]中选一个主元;将s = {A[[] \ pivot}分成2个独立子集:A1 = {a ∈ s| a <= pivot} 和A2 = {a ∈ s| a >= pivot};A[] = quick_sort(A1, N1){pivot}quick_sort(A2, N2);
}

注意:对于较小的数组(N <= 20)排序,快速排序不如插入排序好,因此我们通常会设定一个值cutoff,来检查数组中元素个数,如果元素个数过少,我们使用插入排序

10.2 代码实现

/*
**作用:对当前数组首元素,尾元素和中间元素进行比较。将最小值放至数组首位,**     最大值放置数组末尾,中间值放至数组末尾前一个位置。将中间值作为主元**     并返回
*/
element_type median3(element_type A[], int left, int right)
{int center = (left + right) / 2;if (A[left] > A[center])swap(&A[left], &A[center]);if (A[left] > A[right])swap(&A[left], &A[right]);if (A[center] > A[right])swap(&A[center], &A[right]);//此时A[left] <= A[center] <= A[right]swap(&A[center], &A[right-1]);	//将基准pivot放到数组末尾前一个为止//如此剩余的数组只需要考虑A[left+1]...A[right-2]return A[right-1];	//返回基准pivot
}/*
**作用:使用递归算法实现快速排序
*/
void QSort(element_type A[], int left, int right)
{int cutoff, low, high;element_type pivot;cutoff = 100;	//设定数据量下限if (right - left >= cutoff){	//如果数据量够大,使用快速排序pivot = median3(A, left, right);	//选基准low = left; high = right - 1;while (1){	//将序列中比基准小的元素移至左边,大的移至右边while (A[++low] < pivot);while (A[--high] > pivot);if (low < high) swap(&A[low], &A[high]);else break;}swap(&A[low], &A[right-1]);	//此时A[low]即位pivot正确位置QSort(A, left, low-1);	//递归解决左子列QSort(A, low+1, right);	//递归解决右子列}else insertion_sort(&A[left], right-left+1);	//数据量过小,使用插入排序
}/*
**作用:快速排序的对外接口
*/
void quick_sort(element_type A[], int N)
{QSort(A, 0, N-1);
}

10.3 内容补充

1. CSDN:快速排序算法—图文详解,一篇就够了!

2. 菜鸟教程:快速排序

http://www.dtcms.com/a/474329.html

相关文章:

  • 前端梳理体系从常问问题去完善-框架篇(Vue2Vue3)
  • 【数据分享】青藏高原10米分辨率DEM数据集
  • 网站正在建设中空白模板网站建设调查通知
  • 【星闪】Hi2821 | 低功耗开发 + 低功耗管理及按键唤醒例程
  • 怎么做网站的网盘品牌网站建设公司有哪些
  • 【Linux】Socket编程基础
  • 长春建网站wordpress 图片打开慢
  • 91工业设计网模板网站有利于做seo吗
  • 做网站蓝色和什么颜色搭配好看万维网站注册
  • Windows 10 使用 VMware Workstation 搭建 Ubuntu 虚拟机
  • 深入解析Litho的多智能体协同架构与ReAct推理机制
  • 机器视觉---ViBe算法
  • Product Hunt 每日热榜 | 2025-10-12
  • C++11 多线程与并发编程
  • 太原网站建设优化有什么ae做动图的网站
  • 【全志V821_FoxPi】9-3 Linux IIC驱动SSD1306(0.96寸oled屏幕)
  • crm管理系统登录入口官网龙华网站优化
  • 基于S32DS配置S32K344的FlexCAN模块
  • typescript中的难点总结
  • PHP 字符串处理详解
  • 【JUC】线程池有哪些拒绝策略?该如何选择使用?
  • 4 随机数 从一个随机数到另外一个随机数、等概率随机
  • 机器学习17:如何有效使用自监督式学习
  • 生成对抗网络(GAN)及其变种:CycleGAN和StarGAN
  • dede网站地图html文件公司部门撤销要求转岗不同意怎么办
  • 国外购买空间的网站有哪些最优惠的网站优化
  • Linux安装JDK1.8 tomcat MariaDB(MySQL删减版)
  • 【C++】C++中的异常处理try-catch
  • 珠海专业做网站的公司交友软件
  • rclone:安装与配置