1.基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中左边的元素值都要小于等于基准值,右边的元素都要大于等于基准值,然后再按此方法对这两部分数据分别进行快速排序。整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边
(3)然后对左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述步骤至左边右边数据均有序即完成排序

举例:

2.性能分析

时间复杂度:最坏O(n^2) 最好O(NlogN)
空间复杂度:最坏O(N) 最好O(logN)
稳定性:不稳定

3.代码实现

递归代码如下:

import java.util.Arrays;public class TestDemo {public static void qSort(int[] array) {//递归实现快速排序的方法qSortHelper(array,0,array.length-1);}private static void qSortHelper(int[] array, int left, int right) {//如果数组中的元素个数只有0个或1个,排序完成if (left >= right){return;}//找到基准值最终的位置记作posint pos = partition(array,left,right);//针对基准值左侧元素进行快速排序qSortHelper(array,left,pos-1);//针对基准值右侧的元素进行快速排序qSortHelper(array,pos+1,right);}private static int partition(int[] array, int left, int right) {int beg = left;int end = right;int ret = array[right];while (beg < end){//总左往右找,找到第一个大于基准值的元素while (beg < end && array[beg] <= ret){beg++;}//从右往左找,找到第一个小于基准值的元素while (beg < end && array[end] >= ret){end--;}//交换beg,end下标对应的元素swap(array,beg,end);}//将基准值放到合适的位置swap(array,beg,right);//返回基准值的下标return beg;}private static void swap(int[] array, int beg, int end) {int tmp = array[beg];array[beg] = array[end];array[end] = tmp;}public static void main(String[] args) {int[] array = {9,5,2,7,3,6,8};qSort(array);System.out.println(Arrays.toString(array));}}

非递归代码如下:


import java.util.Arrays;
import java.util.Stack;public class Demo {public static void qSort(int[] array){if (array.length == 0){return;}//借助栈来保存左右边界的下标Stack<Integer> stack = new Stack<>();stack.push(array.length-1);stack.push(0);while (!stack.isEmpty()){int left = stack.pop();int right = stack.pop();if (left >= right){continue;}int pos = partition(array,left,right);stack.push(right);stack.push(pos+1);stack.push(pos-1);stack.push(left);}}private static int partition(int[] array, int left, int right) {int beg = left;int end = right;int ret = array[right];while (beg < end){while (beg < end && array[beg] <= ret){beg++;}while (beg < end && array[end] >= ret){end--;}swap(array,beg,end);}swap(array,beg,right);return beg;}private static void swap(int[] array, int beg, int end) {int tmp = array[beg];array[beg] = array[end];array[end] = tmp;}public static void main(String[] args) {int[] array = {9,5,2,7,3,6,8};qSort(array);System.out.println(Arrays.toString(array));}
}

玩转快速排序(递归+非递归)相关推荐

  1. 数据结构学习笔记之快速排序(非递归)

    数据结构学习笔记之快速排序(非递归) 代码如下: #include<assert.h> #include<memory.h> //快速排序(升序) void QuickSort ...

  2. 一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归)

    前言 大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研.笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历. 这部分很多人可能会但是 ...

  3. java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

    import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...

  4. 快排递归非递归python_Python递归神经网络终极指南

    快排递归非递归python Recurrent neural networks are deep learning models that are typically used to solve ti ...

  5. c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析

    C语言数据结构中二分查找递归非递归实现并分析 前言: 二分查找在有序数列的查找过程中算法复杂度低,并且效率很高.因此较为受我们追捧.其实二分查找算法,是一个很经典的算法.但是呢,又容易写错.因为总是考 ...

  6. 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++

    a b c 使用 1 2 3 表示 /* 描述:二叉树的深度(前序 中序 后序 递归非递归搜素).广度.搜索 作者:jz 日期:20140819 */ #include<stdio.h> ...

  7. 二叉树——中序遍历(递归/非递归)

    中序遍历,即遍历顺序为:左节点.根节点.右节点. 二叉树节点: public class Node {public Node left;public Node right;public int val ...

  8. 树的深度 递归非递归实现

    树的深度 递归非递归实现 package com.dugstudio.SwordToOffer;import java.util.LinkedList;/*** 树的深度递归和非递归算法*/ clas ...

  9. Java 二叉树后序遍历(递归/非递归)

    Java 二叉树后序遍历(递归/非递归) 简介: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次. 设L.D.R分 ...

  10. java建树_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

    本文实例讲述了Java实现的二叉树常用操作.分享给大家供大家参考,具体如下: import java.util.ArrayDeque; import java.util.Queue; import j ...

最新文章

  1. 一道有关球赛队员分配的C++程序题目
  2. 项目支出数据产生过程
  3. Spark SQL Catalyst源代码分析之TreeNode Library
  4. Open/Close Port in Centos
  5. easyui combobox java_Easyui的combobox实现动态数据级联效果
  6. 随想录(强大的kprobe)
  7. ajax success重复,ajax中success函数中的事件会叠加吗?
  8. C语言 n的作业,C语言作业练习
  9. 面向对象的三大特性之三:封装
  10. win10系统镜像下载及在VMware虚拟机上创建虚拟机
  11. 常用的高光谱遥感影像数据集(详细介绍+下载链接)
  12. SECS/GEM如何开发
  13. Token是什么 Token登录认证
  14. 4回溯法、空间状态树
  15. java 读取文本_Java如何读取txt文件的内容?
  16. 商业拜访需要注意的13个小细节
  17. 单片机控制蜂鸣器和弦音发音程序
  18. CentOS的自动化安装光盘制作 (详细流程)
  19. 雷达编程实战之恒虚警率(CFAR)检测
  20. 人的本能和本性在游戏里表现无疑

热门文章

  1. 分布式事务解决方案:seata
  2. Oracle 无效的列索引
  3. 金融类的APP该如何进行ASA推广
  4. 娱乐类剪辑素材怎么找?这3个网站很好用
  5. centos7使用letsencrypt获取免费https证书
  6. 知乎“小猪佩奇”问题下的一些有趣数据
  7. JavaScript数据类型有哪些?
  8. php宠物喂食,正确养猫姿势 阴阳师庭院宠物喂养心得
  9. UG8.0数控编程讲解螺旋铣孔,如何做出完美的刀路
  10. 五分钟教你如何制作学生期末网页作业(web前端期末大作业)