文章目录

  • 1. 思想
  • 2. 示例
  • 3. 代码

1. 思想

快速排序是一种常用的排序方法。

快速排序的思想是:

  • 首先在数组中选定一个参考值。
    这个参考值的作用是:将整个数组分成两个部分。小于这个参考值的所有值都在参考值的左边,大于这个参考值的所有值都在参考值的右边。
  • 然后对小于参考值的部分和大于参考值的部分,分别使用相同的方法。直到这个部分无法再分为止。这就是快速排序的算法。

快速法排序参考值二分示意表

2. 示例

例子. 给定一个整型数组,使用快速法进行排序。默认是升序排序。

下面是原始的数据,共有10个元素。记为 :

第一轮排序:

具体的可以参看文章基础算法-快速排序,更详细。

3. 代码

C++

​
#include <iostream>
using namespace std;// 前向声明.
void quickSort(int *originalArray, int leftIndex, int rightIndex);int main()
{// 整数的个数.int numbers = 0;cin >> numbers;// 保存整数的数组.int *originalData = new int[numbers];// 从标准输入中读取数据.for (int i = 0; i < numbers; ++i){cin >> originalData[i];}// 对数据进行排序.// 使用二分排序法.quickSort(originalData, 0, numbers - 1);// 输出最小值和最大值.cout << originalData[0] << " " << originalData[numbers - 1] << endl;return 0;
}void quickSort(int *originalArray, int leftIndex, int rightIndex)
{// leftIndex 的备份.int backLeft = leftIndex;// rightIndex 的备份.int backRight = rightIndex;// 递归结束条件.if (leftIndex > rightIndex){// nothing to do.}else{// 参考标准.int standardValue = originalArray[leftIndex];while (leftIndex < rightIndex){// 在 middleIndex 的右边部分,从后往前找到一个比 middleIndex 元素值小的元素.while (leftIndex < rightIndex){if (originalArray[rightIndex] >= standardValue){// next element.--rightIndex;}else{break;}}originalArray[leftIndex] = originalArray[rightIndex];// 在 middleIndex 的左边部分,从前往后找到一个比 middleIndex 元素值大的元素.while (leftIndex < rightIndex){if (originalArray[leftIndex] <= standardValue){// next element.++leftIndex;}else{break;}}originalArray[rightIndex] = originalArray[leftIndex];}// 保存标准值.originalArray[leftIndex] = standardValue;// 递归调用自身.quickSort(originalArray, backLeft, leftIndex - 1);quickSort(originalArray, leftIndex + 1, backRight);}
}

Java

​
import java.util.Arrays;
import java.util.Scanner;public class QuickSort
{public static void main(String[] args){Scanner scanner = new Scanner(System.in);int numbers = Integer.parseInt(scanner.nextLine());int[] originalArray = new int[numbers];for (int i = 0; i < numbers; ++i){originalArray[i] = scanner.nextInt();}quickSort(originalArray, 0, numbers - 1);System.out.println(Arrays.toString(originalArray));scanner.close();}public static void quickSort(int[] originalData, int leftIndex, int rightIndex){int backLeft = leftIndex;int backRight = rightIndex;if (leftIndex > rightIndex){// nothing to do.}else{int standardValue = originalData[leftIndex];while (leftIndex < rightIndex){while (leftIndex < rightIndex){if (originalData[rightIndex] >= standardValue){// next element.--rightIndex;}else{break;}}originalData[leftIndex] = originalData[rightIndex];while (leftIndex < rightIndex){if (originalData[leftIndex] <= standardValue){// next element.++leftIndex;}else{break;}}originalData[rightIndex] = originalData[leftIndex];}originalData[leftIndex] = standardValue;// 递归调用自身.quickSort(originalData, backLeft, leftIndex - 1);quickSort(originalData, leftIndex + 1, backRight);}}
}

lcg_magic算法笔记:快速排序相关推荐

  1. 算法笔记-快速排序(C版本与Python版本)

    算法笔记-快速排序 作者:星河滚烫兮 前言   本文主要聚焦于算法的代码实现,原理不做详细说明,可参考代码注释.代码分为C语言版本和python版本,其中C语言版本对于基准元素是选择首元素的,这样对于 ...

  2. lcg_magic算法笔记:反转单链表

    文章目录 1. 题目 2. 无头结点的单链表 2.1. 原始单链表 2.2. 反转过程 2.3. 代码 2.4. 结果 2.5. Github 3. 带头结点的单链表 3.1. 初始单链表 3.2. ...

  3. lcg_magic算法笔记:冒泡排序

    文章目录 冒泡排序 1. 思想 2. 算法 3. 代码 4. 结果 5. 疑问 6. 改进 7. 更新 8. 比较 9. 源码 10. 文件 冒泡排序 1. 思想 冒泡排序,人如其名,排序过程就是一个 ...

  4. lcg_magic算法笔记:插入排序

    文章目录 插入排序(Insertion Sort) 1. 名称 2. 思想 3. 算法伪代码 4. 代码实现 5. 测试结果 插入排序(Insertion Sort) 1. 名称 插入排序法,英文名称 ...

  5. lcg_magic算法笔记:堆排序

    文章目录 1. 堆排序 1. 堆排序 作者: dreamcatcher-cx 出处: http://www.cnblogs.com/chengxiao/ 本文版权归作者和博客园共有,欢迎转载,但未经作 ...

  6. 算法笔记(JavaScript版)——排序

    算法笔记(JavaScript版)--排序 本文内容根据Rebert Sedgewick和Kevin Wayne的<算法(第四版)>整理,原代码为java语言,自己修改为JavaScrip ...

  7. 算法笔记(胡凡)学习笔记@Kaysen

    本文旨在记录算法笔记学习过程中的收获和一些知识点,部分易错知识点只针对个人而言,CCF-CSP考试冲鸭!!! Chapter 2 C/C++快速入门(易错知识点) 2.1 基本数据类型 变量定义注意区 ...

  8. 明翰数据结构与算法笔记V0.8(持续更新)

    文章目录 前言 数据结构 `线性表` `数组` `链表` `栈与队列` [串/字符串] 树 并查集 `二叉树` [二叉排序树/二叉搜索树] `红黑树` 红黑树操作 霍夫曼树 `堆` [大/小]根堆 可 ...

  9. 数据结构与算法笔记(青岛大学王卓老师视频)

    写在前面的话: 因为在学习数据结构之前,学习过一年的算法,所以有一些基础,一些我觉得 没必要的代码或知识就没写上,记得多是一些知识点,写的可能对于别人来说 很难接受,望谅解.我学习算法是在Acwing ...

最新文章

  1. 从做大牛那里整理的Python函数相关的学习笔记,希望对你有帮助
  2. ueditor html显示图片,百度ueditor编辑器上传图片后img标签的title、alt属性优化简单方法...
  3. VideoLAN,VLC和FFmpeg社区联合开发AV1解码器
  4. React开发(264):react使用国际化
  5. h5获取http请求头_React 前端获取http请求头信息
  6. mysql如何选择多个表_从两个表mysql中选择多行
  7. Error--解决使用Application Loader提交ipa包审核时的报错:ERROR ITMS-90168: The binary you uploaded was invalid....
  8. 索引 2 超出范围。_重点推荐:音响灯光行业搜索引擎推广教学
  9. 用video标签流式加载
  10. 基于注解的 Spring MVC 简单入门
  11. FFmpeg总结(十四)FFmpeg如何解析直播点播m3u8
  12. 定制问卷|表单收集系统-对接特殊接口(表单系统)
  13. 对抗攻击经典论文剖析(上)【FGSM、BIM、PGD、Carlini and Wagner Attacks (CW)】
  14. python语言实验——某年某月的天数 OJ1160
  15. win7 计算机休眠,WIN7如何关闭睡眠和休眠方式(真正的)
  16. linux ipad 视频,是否可以在iPad或iPad上同时播放多个视频文件?
  17. 各种排序算法耗时比较
  18. 永磁同步电机转子位置估算专题 —— 基波模型类位置估算概要
  19. 运维真的不是夕阳产业!(不谈技术)
  20. Edge浏览器占用大量硬盘空间

热门文章

  1. ASEMI线性稳压器78M05的电路图,78M05有什么应用
  2. 重磅发布!2022大数据十大关键词
  3. 除了iPhone 还有哪些能确保信息安全的手机?
  4. php引用公有类方法_php利用ReflectionClass反射机制获取类public公有方法
  5. 男人为什么容易掉头发?
  6. Oracle12C安装配置
  7. 第二天就跳票 将wikipedia上的英文词条翻译为中文 手动
  8. nokia6闹关机android,诺基亚首款安卓手机为何叫Nokia 6,原因喜人
  9. 为什么马斯克要说2022经济衰退?
  10. c++ 操作hadoop