排序之快速排序(递归)
快速排序:它由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
思路:下面是一个无序数组
a []= {25,37,2,34,33,56,78,5}
第一步:找到一个参考值a[begin]=a[0],将该数与数组最后一个元素a[last]比较,如果a[last]<a[begin],则两者交换位置,
其实我们的参考值并不一定要放入数组里,我们已经达到了排序的目的
{5,37,2,34,33,56,78,25} ========》新的数组
第二步:从第一步看,我们需要设置两个指针分别指向数组的开始和结束,每比较一次,相应的指针应该也随之移动
第三步:我们需要设置比较的方向,先往右比较,再往左比较;这样我们完成了快速排序的第一此排序
{5,25,2,34,33,56,78,37}
第四步:
采用递归思路 书写递归表达
将排序看成从begin 到标尺,标尺到last;将排序任务瞬间细化,函数调用后层层返回,
返回的出口就是begin =last
代码测试
public class Myquicksort {
static void show(int []a) {
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
System.out.println();
}
static void quickSort(int []a,int first,int last)
{
if(last-first<=1) return;
int x=a[first];//比较的标尺
int p1=first;
int p2=last;
boolean sr=true;//比较的方向
D1: while(p1<p2)
{
if(sr)
{
for(int i=p2;i>p1;i--)
{
if(a[i]<=x) {
a[p1++]=a[i];
p2=i;
sr=!sr;
continue D1;
}
}
p2=p1;
}
else
{
for(int i=p1;i<p2;i++)
{
if(a[i]>=x)
{
a[p2--]=a[i];
p1=i;
sr=!sr;
continue D1;
}
}
p1=p2;
}
}
a[p1]=x;
quickSort(a,first,p1-1);
quickSort(a,p1+1,last);
}
public static void main(String[] args) {
int []a= {15,22,13,9,16,33,15,23,18,4,33,25,14};
show(a);
quickSort(a,0,a.length-1);
show(a);
}
}
转载于:https://www.cnblogs.com/nulinulizainuli/p/10526370.html
排序之快速排序(递归)相关推荐
- 非递归快速排序php,快排序的非递归实现(原创)
本文简要介绍快排序的非递归实现方式并给出了C语言版本的源代码,非递归实现由于没有函数调用的消耗,相对于递归方式有一定的优势. 在快排序的递归实现中,函数quicksort(int nlow, int ...
- 排序算法 | 快速排序,算法的图解、实现、复杂度和稳定性分析与优化
今天讲解一下快速排序算法的原理以及实现.复杂度和稳定性分析与优化 目录 1 快速排序的原理 2 快速排序代码实现 3 复杂度和稳定性分析.优化 4 习题练习 1 快速排序的原理 快速排序是所有内部排序 ...
- 9个元素换6次达到排序序列_(算法四)高级排序(快速排序)
1.快速排序 快速排序是对冒泡排序的一种改进.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速 ...
- 排序算法 —— 快速排序
快速排序算法介绍 划分问题:把数组的各个元素重排后分成左右两个部分,使得左边任意元素都小于或等于右边任意元素. 递归求解:把左右两部分分别排序. 快速排序代码 #include <iostrea ...
- 排序算法——快速排序算法
快速排序的基本思想: 通过一趟排序将待排记录分隔成独立的两部分,一部分记录的关键字比基准值小,一部分记录的关键字比基准值大,然后再对这两部分进行同样操作. 1.快速排序递归算法 //快速排序,递归 i ...
- 排序算法--快速排序
快速排序:快速排序(Quicksort)是对冒泡排序的一种改进.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部 ...
- C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序
常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...
- 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...
掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等). 数组高级以及Arrays(掌握) 排序方法 空间复杂度 时间复杂度 稳定性 插 入 排 序 ...
- 排序:快速排序与归并排序
快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所 ...
最新文章
- python使用matplotlib中的errorbar函数可视化误差条、并自定义数据点标记、数据点大小、数据点颜色、数据点边缘颜色、误差棒颜色、误差棒线条宽度、误差棒边界线长度、误差棒边界线厚度等
- 3 个问题:MIT专家论述关于阻碍AutoML发展的障碍
- 2017-9-13:学习笔记
- 相同的字符串哈希值一样吗_关于哈希,来看这里!
- LAMP服务搭建详解
- 单片机GPIO软件模拟I2C通讯程序
- 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限
- Luogu P2580 于是他错误的点名开始了 Trie树 字典树
- html 执行外部js的函数,javascript – Chrome扩展程序:加载并执行外部脚本
- C#——继承[模拟Server类]初始化过程顺序DMEO
- 离散数学平面图对偶图和着色问题
- OAuth2.0在项目中的应用
- java中的链接之其他窗体_两个窗体之间的链接
- c语言中判断输入是否为数字_C语言编程判断回文数
- 一次贴近实战的CTF比赛(cookie欺骗、php函数、Tomcat漏洞、注入、逆向等)
- iOS面试题大全(附带答案)
- redis 集群scan
- 前端写出优雅的代码,融会贯通es6
- 计算机新加一个固态硬盘,老电脑卡顿不一定没救了 加一块SSD就能焕发新生
- HTML如何给网页添加ico图标?
热门文章
- 高度固定 宽度裁剪_六一童装系列:女童汉服连衣服裁剪图分享及缝制工艺解说...
- 怎么用Python写出随时间变化的字_面试必备 | 带你彻底搞懂 Python 生成器
- 小沙的步伐(枚举+暴力)
- 计算机自带的桌面远程,如何远程控制电脑桌面
- 在Windows平台下载及安装 TensorFlow
- 练习题 - 基于快速文本标题匹配的知识问答实现(二,实现篇)
- intelj maven 指定编译器版本
- 作为IT人员,专业和不专业的差别有多大?
- O365(世纪互联)SharePoint 之使用Designer报错
- Mybatis3.3.x技术内幕(十一):执行一个Sql命令的完整流程