快排——排序中的明星算法,也几乎是必须掌握的算法,这次我们来领略以下快排为何魅力如此之大。

快排主要有两种思路,分别是挖坑法和交换法,这里我们以挖坑法为例来进行介绍,交换法可以参考这篇博文。值得一提的是,这篇博文下面有许多批评的声音,质疑为何需要交换,其实是不了解快排具有两种形式,而作者采用了较为不常用的交换法,并无不妥。

挖坑法是指从数组中设定一个支点,将小于该支点的数据移到左边,而大于该支点的数据被移到右边,之后分别对支点左边和右边形成的子数组继续进行快排,采用分治法的思想。以下面的数组为例:

首先选取一个支点,一般都随机选,我们以第一个元素为例。然后设置两个哨兵位置i和j。其中i设置为0,j设置为7【一个是数组的最前面,一个是数组的最后面。】从j开始,如果j位置上的元素大于支点,那么它已经符合我们的要求,即大于支点的元素放置在支点的右边,就无需进行移动,j直接减小一位,继续进行判断。如果小于支点元素,将j位置元素放置在i的位置上。那么7>6,所以j接着会被移至6,2<6,所以将i位置上的元素设置为2。

然后换到i的方向,与j对称,如果i位置上的元素小于支点,i增加一位,反之将i位置上的元素放到j的位置上。2<6,因此i增至1。4仍然小于6,直到8>6。所以将8放置在j的位置上。

再次交换方向,发现1<6,数组变成:

同样的,有9>6和3<6,所以9会被放在位置5,而3被放在位置3。

当i和j已经相等时,将支点放在中心的位置,即

此时,支点左边都是小于6的元素,右边都是大于6的元素。然后对于左边的子数组{2,4,1,3}和右边的子数组{9,8,7}进行同样的操作。根据递归继序进行排序。

时间复杂度:快排几乎是最快的排序算法之一,时间复杂度为O(nlogn)

代码:

    static void quick(int []a, int i, int j)
{
int k = i;
int m = i;
int l = j;
int pivot = a[i]; while (j > i)
{
while (a[j] > pivot && j != i) {
j--;
}
if (i != j)
a[i] = a[j];
else {
a[j] = pivot;
k = j;
break;
}
while(a[i] < pivot && j != i)
i++; if (i != j)
a[j] = a[i];
else {
a[i] = pivot;
k = i;
} }     for (int m:a)
      System.out.print(m+" ");
    System.out,println(); if(k >m && k < l) {
quick(a, m, k - 1);
quick(a, k + 1, l);
} } public static void main(String []args)
{
int [] a = {6,4,8,9,3,1,2,7};
quick(a,0,a.length - 1); }

结果:

         //第一趟排序后,小于6的元素都在左边,大于6的元素都在右边
//对{2,4,1,3}快排之后,以2为支点
//对{1}进行快排,i==j直接结束
//对{4,3}进行排序,直接交换
//对{9,8,7}进行快排

快速排序Quick_Sort的更多相关文章

  1. 快速排序quick_sort(python的两种实现方式)

    排序算法有很多,目前最好的是quick_sort:unstable,spatial complexity is nlogN. 快速排序原理 python实现 严蔚敏的 datastruct书中有伪代码 ...

  2. python数据结构与算法第十二天【快速排序】

    1. 原理如图所示: 2.代码实现 def quick_sort(alist, start, end): """快速排序""" # 递归的退 ...

  3. Pythonic版冒泡排序和快速排序(附:直接插入排序)

    [本文出自天外归云的博客园] 冒泡排序:就是每次排序选最大元素到数组a的最后,排 len(a)-1 次.也就是两个for循环: 1. 外层是待排数组长度的循环,从待排数组长度(初始待排数组长度等于数组 ...

  4. 1、算法介绍,lowB三人组,快速排序

    1.什么是算法 2.递归 # 一直递归,递归完成再打印 def func4(x): if x > 0: func4(x - 1) print(x) func4(5) 3.时间 复杂度 (1)引入 ...

  5. python算法之快速排序

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

  6. 快速排序详解(C语言/python)

    快速排序详解 介绍: 快速排序于C. A. R. Hoare在1960年提出,是针对冒泡排序的一种改进.它每一次将需要排序的部分划分为俩个独立的部分,其中一个部分的数比的数都小.然后再按照这个方法对这 ...

  7. python算法与数据结构-快速排序算法(36)

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

  8. 冒泡(bubblesort)、选择排序、插入排序、快速排序

    冒泡排序(bubblesort) 特点:通过换位置的方式,一直向上冒泡 package main import "fmt" func bubbleSortAsc(arrayA [] ...

  9. Open Data Structure Templates

    数据结构模板 Chen 2016/12/22 前言 本篇博客的模板,全部是我纯手打的,如果有发现错误,请在下方留言指正:).欢迎大家参考. 有一些地方还不是很完善,等过一阵子用C++实现和部分重构下. ...

随机推荐

  1. 根据start和limit从已有的数据列表中获取从start开始的limit个数据

    代码记录(需求:根据start和limit从已有的数据列表中获取从start开始的limit个数据) 已有的数据列表:这个数据列表是经过处理的,可能是在SQL查询时无法处理的如多条件排序,而排序条件需 ...

  2. Netty学习笔记(一)——nio基础

    Netty简单认识: 1) Netty 是由JBOSS 提供的一个Java 开源框架. 2) Netty 是一个异步的.基于事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络I0 程序. 3) ...

  3. 学习笔记:yaml语言教程

    目录 1.YAML基本概念 1.1 简介 1.2 基本语法 1.3 支持的数据结构: 1.4 注意点 2.数据结构 2.1 字典 2.2 数组 2.3 纯量 2.4 强制类型转换,双! 2.5 字符串 ...

  4. Python 日志文件处理

    今天想把 Python 项目中的日志 保存到文件中. 找到了方法.非常简单 https://www.cnblogs.com/nancyzhu/p/8551506.html 1. logging.bas ...

  5. jmeter BeanShell实例-----两个变量之间的断言对比(转)

    jmeter BeanShell实例-----两个变量之间的断言对比 在jmeter的中,断言没法对两个变量的进行对比后判断,只能使用Bean Shell断言来进行,总是有人来问怎么写呢.这里写一个简 ...

  6. redis键的排序操作

    命令名称:sort 语法:sort key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ ...

  7. rman备份跳过read only数据文件,减少备份总量,加快备份时间

    客户需求,RMAN备份时间过长,想缩短备份时间,优化备份. 客户基于表空间进行历史数据归档的方式,将历史的表空间进行read only,想让RMAN跳过只读表空间,减少RMAN备份的数据总量,从而缩短 ...

  8. 【转】Visual Studio Code必备插件

    先ctrl+shift+p,弹出命令面板-选中Extensions:Install Extensions 或者直接点击左侧栏这个扩展按钮(Ctrl+Shift+X) 然后左侧栏就会显示出很多插件,如图 ...

  9. 面试经典算法:优先队列,最大堆,堆排序,左偏树Golang实现

    堆排序 使用优先队列-最小/最大堆可实现. 优先队列 优先队列是一种能完成以下任务的队列:插入一个数值,取出最小的数值(获取数值,并且删除).优先队列可以用二叉树来实现,我们称这种为二叉堆. 最小堆 ...

  10. JSON和XML格式与对象的序列化及反序列化的辅助类

    下面的代码主要是把对象序列化为JSON格式或XML格式等 using System; using System.Collections.Generic; using System.Globalizat ...