0

0

图文讲解Java中实现quickSort快速排序算法的方法

高洛峰

高洛峰

发布时间:2017-01-19 09:13:01

|

1706人浏览过

|

来源于php中文网

原创

相对冒泡排序、选择排序等算法而言,快速排序的具体算法原理及实现有一定的难度。为了更好地理解快速排序,我们仍然以举例说明的形式来详细描述快速排序的算法原理。在前面的排序算法中,我们以5名运动员的身高排序问题为例进行讲解,为了更好地体现快速排序的特点,这里我们再额外添加3名运动员。实例中的8名运动员及其身高信息详细如下(f、g、h为新增的运动员): a(181)、b(169)、c(187)、d(172)、e(163)、f(191)、g(189)、h(182)

在前面的排序算法中,这些排序都是由教练主导完成了,现在运动员人数增加了,教练也想趁机去休息一下,于是教练叫来了两名助手,让这两名助手以快速排序法的排序方式来实现对8名运动员的身高从左到右、从低到高的排序。

按照快速排序法的算法原理,两名助手分别站在运动员排列的两侧,如下图所示

图文讲解Java中实现quickSort快速排序算法的方法

首先,助手1从排列中选出一名运动员(一般选择左侧第1位运动员或最中间的运动员),这里选择运动员A(181)。由于排序是从左到右、从低到高,所以助手1需要一个身高比A(181)更小的运动员(选出来的A(181)作为比较的基准,本轮所有的比较,都是与最初选出来的运动员A(181)比较):

立即学习Java免费学习笔记(深入)”;

图文讲解Java中实现quickSort快速排序算法的方法

下面我们来继续参考快速排序第一轮的详细示意图。

图文讲解Java中实现quickSort快速排序算法的方法

图文讲解Java中实现quickSort快速排序算法的方法

图文讲解Java中实现quickSort快速排序算法的方法

图文讲解Java中实现quickSort快速排序算法的方法

Matlab语言的特点 中文WORD版
Matlab语言的特点 中文WORD版

本文档主要讲述的是Matlab语言的特点;Matlab具有用法简单、灵活、程式结构性强、延展性好等优点,已经逐渐成为科技计算、视图交互系统和程序中的首选语言工具。特别是它在线性代数、数理统计、自动控制、数字信号处理、动态系统仿真等方面表现突出,已经成为科研工作人员和工程技术人员进行科学研究和生产实践的有利武器。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

当两名助手在排序寻找的过程中相遇后,就停止当前轮次的比较,并把最初选出来的运动员A(181)放在两名助手相遇的空位上

在快速排序中,当两名助手相遇时,本轮排序就结束了。此时,我们发现,以两名运动员相遇的位置A(181)作为分割点,排列左边的都是身高比A(181)小的运动员,排列右侧的都是身高比A(181)大的运动员。这个时候,我们再把A(181)左侧和右侧的两个排序分开来看,如果我们继续使用上述两名助手的排序方法分别对两边的排列进行排序,那么经过多次排列后,最后就能够得到我们所需要的排序结果。

上面就是快速排序的整个排序实现过程。快速排序就是利用上述的排序规则,将一个排列分为两个排列,两个排列分为四个排列,直到无排列可分为止,最后就得到了我们所需要的排序结果。

现在,我们依然编程Java代码来实现使用快速排序对上述8名运动员的身高进行排序:

/**
 * 对指定的数组中索引从start到end之间的元素进行快速排序
 * 
 * @param array 指定的数组
 * @param start 需要快速排序的数组索引起点
 * @param end 需要快速排序的数组索引终点
 */
public static final void quickSort(int[] array, int start, int end) {
  // i相当于助手1的位置,j相当于助手2的位置
  int i = start, j = end;
  int pivot = array[i]; // 取第1个元素为基准元素
  int emptyIndex = i; // 表示空位的位置索引,默认为被取出的基准元素的位置
  // 如果需要排序的元素个数不止1个,就进入快速排序(只要i和j不同,就表明至少有2个数组元素需要排序)
  while (i < j) {
    // 助手2开始从右向左一个个地查找小于基准元素的元素
    while (i < j && pivot <= array[j])
      j--;
    if (i < j) {
      // 如果助手2在遇到助手1之前就找到了对应的元素,就将该元素给助手1的"空位",j成了空位
      array[emptyIndex] = array[emptyIndex = j];
    }
     
    // 助手1开始从左向右一个个地查找大于基准元素的元素
    while (i < j && array[i] <= pivot)
      i++;
    if (i < j) {
      // 如果助手1在遇到助手2之前就找到了对应的元素,就将该元素给助手2的"空位",i成了空位
      array[emptyIndex] = array[emptyIndex = i];
    }
  }    
  // 助手1和助手2相遇后会停止循环,将最初取出的基准值给最后的空位
  array[emptyIndex] = pivot;
   
  // =====本轮快速排序完成=====
   
  // 如果分割点i左侧有2个以上的元素,递归调用继续对其进行快速排序
  if (i - start > 1) {
    quickSort(array, 0, i - 1);
  }
  // 如果分割点j右侧有2个以上的元素,递归调用继续对其进行快速排序
  if (end - j > 1) {
    quickSort(array, j + 1, end);
  }
}
 
//主方法
public static void main(String[] args) {
  // =====使用快速排序法对表示8名运动员身高的数组heights进行从低到高的排序=====
  // A(181)、B(169)、C(187)、D(172)、E(163)、F(191)、G(189)、H(182)
  int[] heights = { 181, 169, 187, 172, 163, 191, 189, 182 };
  // 调用快速排序方法
  quickSort(heights, 0, heights.length - 1);
  // 输出排序后的结果
  for (int height : heights) {
    System.out.println(height);
  }
}

以上Java代码运行结果输出如下:

163
169
172
181
182
187
189
191

注意:由于局部思维差异,上述快速排序的代码实现可能存在多种变体。不过,无论何种形式的变体,快速排序的核心思想并不会发生改变。

另一种实现:单向扫描
快速排序的数组切分还有另一种单向扫描的版本,具体步骤是选择数组中最后一个元素作为切分元素,同样设置两个指针,指针i指向数组中第一个元素前面一个位置,j则指向数组中第一个元素。j从前左右往右扫描,遇到小于等于切分元素时就把i加一,然后交换i和j指向的元素。最后把i+1位置的元素和切分元素交换即可完成一次数组划分。代码实现如下:

int partition(int[] a, int lo, int hi) {
  int i = lo - 1, j = lo;
  int v = a[hi];
  while (j < hi) {
    if (a[j] <= v) {
      swap(a, ++i, j);
    }
    j++;
  }
  swap(a, i + 1, hi);
  return i + 1;
}

更多图文讲解Java中实现quickSort快速排序算法的方法相关文章请关注PHP中文网!

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
FastJson教程手册
FastJson教程手册

共25课时 | 16.8万人学习

Go语言教程手册
Go语言教程手册

共23课时 | 15.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号