快速排序(Quicksort)是对冒泡排序的一种改进,是一种排序执行效率很高的排序算法。

快速排序的基本思想是:通过一趟排序,将要排序的数据分隔成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此使整个数据变成有序序列。

具体做法是:假设要对某个数组进行排序,首先需要任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它的前面,所有比它大的数都放到它的后面。这个过程称为一趟快速排序;递归调用此过程,即可实现数据的快速排序。
例 1
利用快速排序法对一数组进行排序,实现步骤如下。

(1) 声明静态的 getMiddle() 方法,该方法需要返回一个 int 类型的参数值,在该方法中传入 3 个参数。代码如下:

public static int getMiddle(int[] list, int low, int high) {int tmp = list[low]; // 数组的第一个值作为中轴(分界点或关键数据)while (low < high) {while (low < high && list[high] > tmp) {high--;}list[low] = list[high]; // 比中轴小的记录移到低端while (low < high && list[low] < tmp) {low++;}list[high] = list[low]; // 比中轴大的记录移到高端}list[low] = tmp; // 中轴记录到尾return low; // 返回中轴的位置
}

(2) 创建静态的 unckSort() 方法,在该方法中判断 low 参数是否小于 high 参数,如果是则调用 getMiddle() 方法,将数组一分为二,并且调用自身的方法进行递归排序。代码如下:

public static void unckSort(int[] list,int low,int high) {if(low < high) {int middle = getMiddle(list,low,high);    // 将list数组一分为二unckSort(list,low,middle-1);    // 对低字表进行递归排序unckSort(list,middle+1,high);    // 对高字表进行递归排序}
}

(3) 声明静态的 quick() 方法,在该方法中判断传入的数组是否为空,如果不为空,则调用 unckSort() 方法进行排序。代码如下:

public static void quick(int[] str) {if(str.length > 0) {// 查看数组是否为空unckSort(str,0,str.length-1);}
}

(4) 在 main() 方法中声明 int 类型的 number 数组,接着输出该数组中的元素。然后调用自定义的 quick() 方法进行排序,排序后重新输出数组中的元素。代码如下:

int[] number={13,15,24,99,14,11,1,2,3};
System.out.println("排序前:");
for(int val:number) {System.out.print(val+" ");
}
quick(number);
System.out.println("\n排序后:");
for(int val:number) {System.out.print(val +" ");
}

运行前面的代码进行测试,输出结果如下:

排序前:
13 15 24 99 14 11 1 2 3
排序后:
1 2 3 11 13 14 15 24 99

1.16 快速排序法(Quicksort)相关推荐

  1. 经典算法之快速排序法(附B站最细讲解视频)

    活动地址:21天学习挑战赛 文章目录 一.算法 1.算法概述 2.算法步骤 3.算法特点 二.算法实践 1.Java代码 2.执行结果 3.讲解视频 三.复杂度分析 1.时间复杂度 2.空间复杂度 一 ...

  2. 经典算法—快速排序(Quicksort)使用详解

    快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的 ...

  3. 探索初级算法学习笔记-快速排序法

    快速排序法学习笔记 #include<stdio.h>void swap(int *a,int *b) {int t;t=*a;*a=*b;*b=t; }void quickSort(in ...

  4. 快速排序算法QuickSort(二)

    1.说明 这个快速排序算法是对前面的 快速排序算法QuickSort  一种改进. 只是修改了int Partition(int arry[],int start,int end)这个方法. 2.思路 ...

  5. 算法之旅 | 快速排序法

    HTML5学堂-码匠:前几期"算法之旅"跟大家分享了冒泡排序法和选择排序法,它们都属于时间复杂度为O(n^2)的"慢"排序.今天跟大家分享多种排序算法里使用较广 ...

  6. oracle快速排序法,经典算法系列之快速排序算法

    快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但 ...

  7. 【JavaScript算法】---快速排序法

    一.快速排序法概念 我们将一个杂乱无章的数组进行一个快速排序,可以先从一个数组中取一个中间值,将一个数组一分为2,左边的数组跟中间值进行比较,小的放在左边,大的放在右边.比较完毕后再次取中间值,再次比 ...

  8. c语言排快速排序过程,C语言中快速排序法怎么排

    快速排序法的排法:首先每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边:然后将大于等于基准点的数全部放到基准点的右边:最后在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之 ...

  9. 【重温基础算法】内部排序之快速排序法

    内部排序之快速排序法 文章目录 内部排序之快速排序法 主要思想 过程演示 JAVA代码 算法分析 时间复杂度分析 最好时间复杂度 最坏时间复杂度 平均时间复杂度 空间复杂度 对冒泡排序的一种优化 主要 ...

最新文章

  1. 【树莓派】制作树莓派最小镜像:img裁剪瘦身
  2. webp、jpeg、png三种压缩算法比较
  3. .NET代码编写规范 整理
  4. vue通过class获取dom_.NET Core通过Json或直接获取图形验证码(务必收藏备用)
  5. vue父子组件生命周期顺序_vue父子组件生命周期执行顺序
  6. 感恩有您!《大数据》祝您新年快乐!
  7. Kubernetes学习总结(13)—— Kubernetes 各个组件的概念
  8. java中的抽象类(abstract)
  9. c语言 fread读指定字节,fread函数 c语言中fread函数怎么用
  10. 海康威视设备发现sdp原理
  11. python人脸融合_使用 python 进行 面部合成
  12. 详解python使用browsermobproxy获取当前网页xhr的get数据方法
  13. 字节跳动怎么都十万人了?
  14. 唯冠也很苦!赢了苹果也付不出律师费
  15. MyBatis Generator报错:Cannot instantiate object of type
  16. 吉林全国计算机报名系统入口,http://ncre.jleea.com.cn吉林计算机等级考试报名系统入口...
  17. jenkins下载插件失败的解决方案
  18. mac卸载python3.7_工具安装-Mac 卸载python3
  19. 笔记本添加外置显示器
  20. 基于MATLAB的变长信源编码算法的性能比较

热门文章

  1. 6.1 Tensorflow笔记(基础篇):队列与线程
  2. 5.1 Tensorflow:图与模型的加载与存储
  3. OS_CORE.C(11)
  4. javascript对时间的处理
  5. PKG_CONFIG_PATH 、LD_LIBRARY_PATH、PATH三个的作用
  6. 观察者模式--模拟3D彩票公众号
  7. python 中使用celery
  8. Windows Phone 的控件倾斜效果
  9. 区块链BaaS云服务(37)荷兰Techruption 区块链
  10. 《研磨设计模式》chap8 生成器模式Builder