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

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

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

首先选取一个支点,一般都随机选,我们以第一个元素为例。然后设置两个哨兵位置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. amazeUI modal 模态框 关闭属性

    $('#my-prompt').modal({ relatedTarget: this, closeViaDimmer: false, // 点击外部空白处不关闭弹窗 closeOnConfirm:f ...

  2. 【leetcode算法-简单】27. 移除元素

    [题目描述] 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空 ...

  3. 基于nginx与zookeeper的API Gateway实现笔记 - 环境搭建

    为了简化操作,采用操作系统为CentOS 8. 首先需要编译出libzookeeper,在官网下载最新的zookeeper源码,或者github上clone一个,地址为:https://github. ...

  4. 利用Python进行数据分析_Numpy_基础_2

      Numpy数据类型包括: int8.uint8.int16.uint16.int32.uint32.int64.uint64.float16.float32.float64.float128.co ...

  5. go 结构的方法总结

    方法可以与命名类型或命名类型的指针关联. 刚刚看到的两个 Abs 方法.一个是在 *Vertex 指针类型上,而另一个在 MyFloat 值类型上. 有两个原因需要使用指针接收者.首先避免在每个方法调 ...

  6. django中使用redis保存session(转)

    原文:https://blog.csdn.net/Enjolras_fuu/article/details/79661582 Django-redis-session官网:https://pypi.o ...

  7. Python练习_购物车_day6

    第一次代码 (1) 输出商品列表,用户输入序号,显示用户选中的商品. 页面显示 序号 + 商品名称,如: 1 手机 2 电脑 (2): 用户输入选择的商品序号,然后打印商品名称 (3):如果用户输入的 ...

  8. Java 之 泛型

    一.泛型概述 集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成 Object 类型.当我们取出一个对象,并且进行相应的操作,这时必须采用类型转换. 先观察下面代码: publ ...

  9. FlowPortal BPM流程中调用封装好的API如何调试

    遇到复杂一点的业务,我们常常都会将业务逻辑封装到一个dll中,在流程中调用封装好的API. 业务逻辑库封装到企业库后,是可以在Visual Studio中调试库的哦. [附加到进程] [流程中调用AP ...

  10. SAP应用真的不性感么

    这是一个问题. 上图的One Order是楼下一个部门领导让我给他的团队做的一个古老框架的session. 这个框架诞生于2000年,采用纯面向过程的思路开发.因为上世纪90年代ABAP开始引入对面向 ...