玩转快速排序(递归+非递归)
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));}
}
玩转快速排序(递归+非递归)相关推荐
- 数据结构学习笔记之快速排序(非递归)
数据结构学习笔记之快速排序(非递归) 代码如下: #include<assert.h> #include<memory.h> //快速排序(升序) void QuickSort ...
- 一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归)
前言 大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研.笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历. 这部分很多人可能会但是 ...
- java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...
import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...
- 快排递归非递归python_Python递归神经网络终极指南
快排递归非递归python Recurrent neural networks are deep learning models that are typically used to solve ti ...
- c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析
C语言数据结构中二分查找递归非递归实现并分析 前言: 二分查找在有序数列的查找过程中算法复杂度低,并且效率很高.因此较为受我们追捧.其实二分查找算法,是一个很经典的算法.但是呢,又容易写错.因为总是考 ...
- 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++
a b c 使用 1 2 3 表示 /* 描述:二叉树的深度(前序 中序 后序 递归非递归搜素).广度.搜索 作者:jz 日期:20140819 */ #include<stdio.h> ...
- 二叉树——中序遍历(递归/非递归)
中序遍历,即遍历顺序为:左节点.根节点.右节点. 二叉树节点: public class Node {public Node left;public Node right;public int val ...
- 树的深度 递归非递归实现
树的深度 递归非递归实现 package com.dugstudio.SwordToOffer;import java.util.LinkedList;/*** 树的深度递归和非递归算法*/ clas ...
- Java 二叉树后序遍历(递归/非递归)
Java 二叉树后序遍历(递归/非递归) 简介: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次. 设L.D.R分 ...
- java建树_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...
本文实例讲述了Java实现的二叉树常用操作.分享给大家供大家参考,具体如下: import java.util.ArrayDeque; import java.util.Queue; import j ...
最新文章
- 一道有关球赛队员分配的C++程序题目
- 项目支出数据产生过程
- Spark SQL Catalyst源代码分析之TreeNode Library
- Open/Close Port in Centos
- easyui combobox java_Easyui的combobox实现动态数据级联效果
- 随想录(强大的kprobe)
- ajax success重复,ajax中success函数中的事件会叠加吗?
- C语言 n的作业,C语言作业练习
- 面向对象的三大特性之三:封装
- win10系统镜像下载及在VMware虚拟机上创建虚拟机
- 常用的高光谱遥感影像数据集(详细介绍+下载链接)
- SECS/GEM如何开发
- Token是什么 Token登录认证
- 4回溯法、空间状态树
- java 读取文本_Java如何读取txt文件的内容?
- 商业拜访需要注意的13个小细节
- 单片机控制蜂鸣器和弦音发音程序
- CentOS的自动化安装光盘制作 (详细流程)
- 雷达编程实战之恒虚警率(CFAR)检测
- 人的本能和本性在游戏里表现无疑