快速排序(Quick Sort)

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

1.算法描述

快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。/

2.具体算法实现

  • 先选择一个基准(base),一般是数组最左边的值,或者是最右边的值(如果base是左边,则从右边开始。)

  • 如果j需要从右往左遍历,如果发现arr[j]<base则停下,i开始从左往右遍历,发现arr[i]>base停下。

  • 交换arr[i]与arr[j]的位置

  • 然后j和i继续寻找,并交换位置



  • 当i和j相同时,结束一轮寻找,并将此时的数字与base交换。

  • 此时根据base,将数组分割成两个部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

3. 算法分析

快速排序算法的时间复杂度和各次标准数据元素的值关系很大。如果每次选取的标准元素都能均分两个子数组的长度,这样的快速排序过程是一个完全二叉树结构。(即每个结点都把当前数组分成两个大小相等的数组结点,n个元素数组的根结点的分解次数就构成一棵完全二叉树)。这时分解次数等于完全二叉树的深度log2n;每次快速排序过程无论把数组怎样划分、全部的比较次数都接近于n-1次,所以最好情况下快速排序算法的时间复杂度为O(nlog2n):快速排序算法的最坏情况是数据元素已全部有序,此时数据元素数组的根结点的分需次数构成一棵二叉退化树(即单分支二叉树),一棵二叉退化树的深度是n,所以最坏情况下快速排序算法的时间复杂度为O(n2)。般情况下 ,标准元素值的分布是随机的,数组的分邮大数构成模二又树,这样的二叉树的深度接近于log2n, 所以快速排序算法的平均(或称期望)时间复杂度为O(nlog2n)

public class quickSort {
public static void main(String[] args)
{
int[] arr=new int[10000];
int n=arr.length;
Random random = new Random();//默认构造方法
for(int i=0;i<n;i++)
{
arr[i]=(int)random.nextInt(100);//在数组中随机生成[0,100)的数
}
funQuickSort(arr,0,n-1); } public static void funQuickSort(int[] arr,int start,int end )
{
if(start>end)
{
return;
}
int base=arr[start];
int i=start;
int j=end;
while (i!=j)
{
while(arr[j] >= base && i < j)
{
j--;
}
while(arr[i] <= base && i < j)
{
i++;
}
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
arr[start]=arr[i];
arr[i]=base;
funQuickSort(arr,start,i-1);
funQuickSort(arr,j+1,end);
}
}

快速排序前的数组:2 43 7 46 43 25 26 36 22 35 32 41 26 34 42 29 39 43 4 3 46 4 17 45 36 48 21 16 26 0 39 45

快速排序后的数组:0 2 3 4 4 7 16 17 21 22 25 26 26 26 29 32 34 35 36 36 39 39 41 42 43 43 43 45 45 46 46 48

排序算法—快速排序(Quick Sort)的更多相关文章

  1. 排序算法 - 快速排序(Quick Sort)

    算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想  ...

  2. [算法] 快速排序 Quick Sort

    快速排序(Quick Sort)使用分治法策略. 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分:其中一部分的所有数据都比另外一部分的所有数据都要小.然后,再按此方法对这 ...

  3. 排序:快速排序Quick Sort

    原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序 ...

  4. 基础排序算法之快速排序(Quick Sort)

    快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...

  5. Java中的经典算法之快速排序(Quick Sort)

    Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...

  6. Python排序算法——快速排序

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10768593.html 排序算法(Sortin ...

  7. 快速排序Quick sort

    快速排序Quick sort 原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归 ...

  8. 数据结构和算法(Golang实现)(25)排序算法-快速排序

    快速排序 快速排序是一种分治策略的排序算法,是由英国计算机科学家Tony Hoare发明的, 该算法被发布在1961年的Communications of the ACM 国际计算机学会月刊. 注:A ...

  9. 经典排序算法 – 插入排序Insertion sort

    经典排序算法 – 插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...

  10. 经典排序算法 - 基数排序Radix sort

    经典排序算法 - 基数排序Radix sort 原理类似桶排序,这里总是须要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,临时忽视十位数 比如 待排序数组[ ...

随机推荐

  1. (数据科学学习手札96)在geopandas中叠加在线地图

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 国庆期间,抽空给大家分享在geopandas中叠 ...

  2. 《VC++ 深入详解》 第3版 这是盗版书么~。。。

    <VC++ 深入详解> 第3版 www.broadview.com.cn 书读到一小半,发现书重复了一部分,缺失一部分.... 难受~ 比较难继续下去了 有一样的小伙伴么~ <VC+ ...

  3. Python之路——变量

    什么是变量 #变量即变化的量,核心是"变"与"量"二字,变即变化,量即衡量状态. 为什么要有变量 #程序执行的本质就是一系列状态的变化,变是程序执行的直接体现, ...

  4. STM32之旅4——USART

    STM32之旅4--USART 串口也是用的比较多的,在STM32CubeMX中生成代码后,需要添加一些代码才可以用. drv_usart.h: #ifndef __DRV_USART_H #defi ...

  5. 多测师讲解selenium _enter弹框_高级讲师肖sir

    enter # from selenium import webdriver# from time import sleep# drvier=webdriver.Chrome()# url='file ...

  6. day17 Pyhton学习 内置函数继续

    1. locals 本地作用域/局部作用域  会随着位置的改变而改变 2.globals 全局作用域   永远不变,永远是全局 3.complex:复数 实数(有理数和无理数) 某一个数的平方是-1 ...

  7. win安装appium

    Windows 下配置 Appium,要提前装好jdk,请参考:https://jingyan.baidu.com/article/e8cdb32b2699cb37042bad59.html 1.下载 ...

  8. IntelliJ IDEA 15款 神级超级牛逼插件推荐(超赞,谁用谁知道)

    满满的都是干货  所有插件都是在 ctrl+alt+s 里的plugins 里进行搜索安装 1.CodeGlance 代码迷你缩放图插件 2. Codota 代码提示工具,扫描你的代码后,根据你的敲击 ...

  9. MySQL备份和恢复[2]-基于LVM的快照备份

    准备工作 请求锁定所有表 mysql> FLUSH TABLES WITH READ LOCK; 记录二进制日志文件及事件位置 mysql> FLUSH LOGS; mysql> S ...

  10. MVC注册

    前言 最近没什么写的,写个MVC注册巩固一下 HTML @{ Layout = null; } <!DOCTYPE html> <html> <head> < ...