快速排序:它由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

排序之快速排序(递归)相关推荐

  1. 非递归快速排序php,快排序的非递归实现(原创)

    本文简要介绍快排序的非递归实现方式并给出了C语言版本的源代码,非递归实现由于没有函数调用的消耗,相对于递归方式有一定的优势. 在快排序的递归实现中,函数quicksort(int nlow, int ...

  2. 排序算法 | 快速排序,算法的图解、实现、复杂度和稳定性分析与优化

    今天讲解一下快速排序算法的原理以及实现.复杂度和稳定性分析与优化 目录 1 快速排序的原理 2 快速排序代码实现 3 复杂度和稳定性分析.优化 4 习题练习 1 快速排序的原理 快速排序是所有内部排序 ...

  3. 9个元素换6次达到排序序列_(算法四)高级排序(快速排序)

    1.快速排序 快速排序是对冒泡排序的一种改进.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速 ...

  4. 排序算法 —— 快速排序

    快速排序算法介绍 划分问题:把数组的各个元素重排后分成左右两个部分,使得左边任意元素都小于或等于右边任意元素. 递归求解:把左右两部分分别排序. 快速排序代码 #include <iostrea ...

  5. 排序算法——快速排序算法

    快速排序的基本思想: 通过一趟排序将待排记录分隔成独立的两部分,一部分记录的关键字比基准值小,一部分记录的关键字比基准值大,然后再对这两部分进行同样操作. 1.快速排序递归算法 //快速排序,递归 i ...

  6. 排序算法--快速排序

    快速排序:快速排序(Quicksort)是对冒泡排序的一种改进.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部 ...

  7. C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序

    常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...

  8. 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...

    掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等). 数组高级以及Arrays(掌握) 排序方法 空间复杂度 时间复杂度 稳定性 插 入 排 序 ...

  9. 排序:快速排序与归并排序

    快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所 ...

最新文章

  1. python使用matplotlib中的errorbar函数可视化误差条、并自定义数据点标记、数据点大小、数据点颜色、数据点边缘颜色、误差棒颜色、误差棒线条宽度、误差棒边界线长度、误差棒边界线厚度等
  2. 3 个问题:MIT专家论述关于阻碍AutoML发展的障碍
  3. 2017-9-13:学习笔记
  4. 相同的字符串哈希值一样吗_关于哈希,来看这里!
  5. LAMP服务搭建详解
  6. 单片机GPIO软件模拟I2C通讯程序
  7. 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限
  8. Luogu P2580 于是他错误的点名开始了 Trie树 字典树
  9. html 执行外部js的函数,javascript – Chrome扩展程序:加载并执行外部脚本
  10. C#——继承[模拟Server类]初始化过程顺序DMEO
  11. 离散数学平面图对偶图和着色问题
  12. OAuth2.0在项目中的应用
  13. java中的链接之其他窗体_两个窗体之间的链接
  14. c语言中判断输入是否为数字_C语言编程判断回文数
  15. 一次贴近实战的CTF比赛(cookie欺骗、php函数、Tomcat漏洞、注入、逆向等)
  16. iOS面试题大全(附带答案)
  17. redis 集群scan
  18. 前端写出优雅的代码,融会贯通es6
  19. 计算机新加一个固态硬盘,老电脑卡顿不一定没救了 加一块SSD就能焕发新生
  20. HTML如何给网页添加ico图标?

热门文章

  1. 高度固定 宽度裁剪_六一童装系列:女童汉服连衣服裁剪图分享及缝制工艺解说...
  2. 怎么用Python写出随时间变化的字_面试必备 | 带你彻底搞懂 Python 生成器
  3. 小沙的步伐(枚举+暴力)
  4. 计算机自带的桌面远程,如何远程控制电脑桌面
  5. 在Windows平台下载及安装 TensorFlow
  6. 练习题 - 基于快速文本标题匹配的知识问答实现(二,实现篇)
  7. intelj maven 指定编译器版本
  8. 作为IT人员,专业和不专业的差别有多大?
  9. O365(世纪互联)SharePoint 之使用Designer报错
  10. Mybatis3.3.x技术内幕(十一):执行一个Sql命令的完整流程