lcg_magic算法笔记:快速排序
文章目录
- 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算法笔记:快速排序相关推荐
- 算法笔记-快速排序(C版本与Python版本)
算法笔记-快速排序 作者:星河滚烫兮 前言 本文主要聚焦于算法的代码实现,原理不做详细说明,可参考代码注释.代码分为C语言版本和python版本,其中C语言版本对于基准元素是选择首元素的,这样对于 ...
- lcg_magic算法笔记:反转单链表
文章目录 1. 题目 2. 无头结点的单链表 2.1. 原始单链表 2.2. 反转过程 2.3. 代码 2.4. 结果 2.5. Github 3. 带头结点的单链表 3.1. 初始单链表 3.2. ...
- lcg_magic算法笔记:冒泡排序
文章目录 冒泡排序 1. 思想 2. 算法 3. 代码 4. 结果 5. 疑问 6. 改进 7. 更新 8. 比较 9. 源码 10. 文件 冒泡排序 1. 思想 冒泡排序,人如其名,排序过程就是一个 ...
- lcg_magic算法笔记:插入排序
文章目录 插入排序(Insertion Sort) 1. 名称 2. 思想 3. 算法伪代码 4. 代码实现 5. 测试结果 插入排序(Insertion Sort) 1. 名称 插入排序法,英文名称 ...
- lcg_magic算法笔记:堆排序
文章目录 1. 堆排序 1. 堆排序 作者: dreamcatcher-cx 出处: http://www.cnblogs.com/chengxiao/ 本文版权归作者和博客园共有,欢迎转载,但未经作 ...
- 算法笔记(JavaScript版)——排序
算法笔记(JavaScript版)--排序 本文内容根据Rebert Sedgewick和Kevin Wayne的<算法(第四版)>整理,原代码为java语言,自己修改为JavaScrip ...
- 算法笔记(胡凡)学习笔记@Kaysen
本文旨在记录算法笔记学习过程中的收获和一些知识点,部分易错知识点只针对个人而言,CCF-CSP考试冲鸭!!! Chapter 2 C/C++快速入门(易错知识点) 2.1 基本数据类型 变量定义注意区 ...
- 明翰数据结构与算法笔记V0.8(持续更新)
文章目录 前言 数据结构 `线性表` `数组` `链表` `栈与队列` [串/字符串] 树 并查集 `二叉树` [二叉排序树/二叉搜索树] `红黑树` 红黑树操作 霍夫曼树 `堆` [大/小]根堆 可 ...
- 数据结构与算法笔记(青岛大学王卓老师视频)
写在前面的话: 因为在学习数据结构之前,学习过一年的算法,所以有一些基础,一些我觉得 没必要的代码或知识就没写上,记得多是一些知识点,写的可能对于别人来说 很难接受,望谅解.我学习算法是在Acwing ...
最新文章
- 从做大牛那里整理的Python函数相关的学习笔记,希望对你有帮助
- ueditor html显示图片,百度ueditor编辑器上传图片后img标签的title、alt属性优化简单方法...
- VideoLAN,VLC和FFmpeg社区联合开发AV1解码器
- React开发(264):react使用国际化
- h5获取http请求头_React 前端获取http请求头信息
- mysql如何选择多个表_从两个表mysql中选择多行
- Error--解决使用Application Loader提交ipa包审核时的报错:ERROR ITMS-90168: The binary you uploaded was invalid....
- 索引 2 超出范围。_重点推荐:音响灯光行业搜索引擎推广教学
- 用video标签流式加载
- 基于注解的 Spring MVC 简单入门
- FFmpeg总结(十四)FFmpeg如何解析直播点播m3u8
- 定制问卷|表单收集系统-对接特殊接口(表单系统)
- 对抗攻击经典论文剖析(上)【FGSM、BIM、PGD、Carlini and Wagner Attacks (CW)】
- python语言实验——某年某月的天数 OJ1160
- win7 计算机休眠,WIN7如何关闭睡眠和休眠方式(真正的)
- linux ipad 视频,是否可以在iPad或iPad上同时播放多个视频文件?
- 各种排序算法耗时比较
- 永磁同步电机转子位置估算专题 —— 基波模型类位置估算概要
- 运维真的不是夕阳产业!(不谈技术)
- Edge浏览器占用大量硬盘空间