热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

快排递归非递归

2019独角兽企业重金招聘Python工程师标准我记得曾经有一个大师说过这么一句话,大概的意思是说如果你懂得了编程,那么请你给我用非递归表达你的思

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

我记得曾经 有一个大师说过这么一句话,大概的意思是说如果你懂得了编程,那么请你给我用非递归表达你的思想。我想非递归隐藏的东西恰恰应该是程序员应该注意的东西。因为递归的隐藏,让我们其实没有真正的理解实现的具体细节。今天我想用非递归的方式去做一下快排。

大家都应该知道快排:

1、不稳定排序

2、时间复杂度:O(nlogn)。糟糕的时候时间复杂度是O(n*n)

思想是

1借用一个元素为flag 让数组左面的数组小于该flag,右面的数大于该flag。

2左右分割区域继续找flag递归1步骤。

非递归的思想更能够清楚的描述快排的思想。

1、设置两个栈区,分别记录前后区域的初始位置和结束为止。(开始为数组的0位置和终止位置len-1)

2、用快排思想找到flag。然后判断前后区域是否为空,如果有一个不为空说明还有需要排序的数据。否则排序过程结束。

package example;

import java.util.Stack;

/**
* Created by Administrator on 2015/11/29.
*/
public class QuickSort {

public static void main(String[] args){
int[] a =new int[]{1,11,4,23,2,78,54,99,102,100,22,34};

       Stack start =new Stack();
       Stack end =new Stack();

       start.push(0);
       end.push(a.length-1);

while(!start.isEmpty()){
int start1= start.pop();
int end1 = end.pop();
int   priot=partition(a,start1,end1);
if(priot>start1+1){
               start.push(start1);
               end.push(priot-1);
           }
if(priot<&#61;end1-1){
               start.push(priot&#43;1);
               end.push(end1);
           }
       }
for(int i&#61;0;i            System.out.println(a[i]);
       }


   }

private static int partition(int[] a, int start1, int end1) {
int priot &#61; a[start1];
int start &#61;start1;

while(start1 while(a[start1] while (a[end1]>priot)  end1--;
swap(a,start1,end1);
        }
       a[start1]&#61;priot;
return start1;

   }

private static void swap(int[] a, int start1, int end1) {
int tmp&#61;a[start1];

       a[start1]&#61;a[end1];
       a[end1]&#61;tmp;
   }


}

2016年8月3日

递归今天写了下&#xff0c;还是总犯错啊&#xff01;&#xff01;&#xff01;&#xff0c;贴出代码吧&#xff0c;继续学习

/**递归快排* &#64;author hassop* &#64;Description* &#64;date 2016/8/3 0003* To change this template use File | Settings | File Templates.*/
public class QuickSearch {/*** 非递归* &#64;param a*/static void quick(int[] a,int begin,int end){//终止条件if(begin&#61;&#61;end){return;}int i&#61;begin&#43;1;int j&#61;end;int k &#61;a[begin];//排序过程while(ik){j--;}while(a[i]&#61;begin){quick(a,begin,i-1);}else {quick(a,begin,begin);}if((i&#43;1)>&#61;end){quick(a,end,end);}else{quick(a,i&#43;1,end);}}static void sweap(int[] a,int i, int j) {int tmp &#61;a[i];a[i]&#61; a[j];a[j]&#61;tmp;}/*psvm*/public static void main(String[] args) {int[] a &#61;{2,1,3,4,19,5,6,8,39,21,65};quick(a, 0, a.length - 1);for(int i&#61;0;i}

 

 

 


转:https://my.oschina.net/zjItLife/blog/537100



推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
author-avatar
湘刘涛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有