取中间的元素s作比较,同样的先得往右找比s大的索引 i,然后往左找比s小的索引 j,只要两边的索引还没有交叉(也就i=j),就交换 i 与 j 的元素值。这里不用再进行轴的交换,因为在寻找交换的过程中,轴位置的元素也会参与交换的动作,轴已经成为一个抽象的概念,代表的是一个数值而已。
public static void QuickSort(int[] number)
{
QuickSort(number, 0, number.length - 1);
}
/**
* 将轴设定为中间的元素,依这个元素作基准进行比较,这可以增加快速排序法的效率
* @param number 待排序数组
* @param left 最小index
* @param right 最大index
*/
private static void QuickSort(int[] number, int left, int right)
{
if (left < right)
{
int s = number[(left + right) / 2];
int i = left - 1;//中间元素作为基准,从0开始比较
int j = right + 1;
while (true)
{
// 1. 令索引 i 从数组左方往右方找,直到找到大于(不小于) s 的数的索引
while (number[++i] < s){}
// 2. 令索引 j 从数组右方往左方找,直到找到小于(不大于) s 的数的索引
while (number[--j] > s){}
// 3. 如果 i >= j,则退出循环
if (i >= j) break;
// 4. 如果 i < j,则交换索引i与j两处的值
swap(number, i, j);
}
// 5. 对轴左边进行递归
QuickSort(number, left, i - 1);
// 6. 对轴右边进行递归
QuickSort(number, j + 1, right);
}
}
private static void swap(int[] number, int i, int j)
{
int t;
t = number[i];
number[i] = number[j];
number[j] = t;
}
有比较,才有进步,才能更清晰地认识事物。下面是两种算法代码差异比较:
1, 轴的选定:
int s = number[left];//V1:将最左边的数设定为轴,并记录其值为 s
int s = number[(left + right) / 2];//V2:中间元素作为基准
2, 左边界的赋值
int i = left;//V1:轴在左边,比较该从index为1的地方开始,参考3
int i = left - 1;//V2:轴在中间,比较该从index为0的地方开始,参考3
3, 比较的不同
while (i + 1 < number.length && number[++i] < s){}
while (j - 1 >= 0 && number[--j] > s) {}
//V1:对i, j进行了越界判断
while (number[++i] < s){}
while (number[--j] > s){}
/*V2:未对i, j进行了越界判断。当number[i]<s的时候循环继续,而s在中间,如果s左边的数都比s小,循环到number[i]=s的时候,s !< s,条件不成立,退出循环。i或者j为s的下标。所以不需要判断。对于V1,因为总是从边界的下一个数开始比较,当左右边界已经靠近时就有可能发生ArrayIndexOutOfBoundsException异常。所以要判断!*/
4, 递归的不同
quicksort(number, left, j - 1);
quicksort(number, j + 1, right);
//V1:因为将新的轴在j处交换,所以递归与j相关
QuickSort(number, left, i - 1);
QuickSort(number, j + 1, right);
//V2:轴在中间,i, j的值也最多能到中间,所以递归与各自的i, j相关。
小结:撇开效率,仅从代码精简来说,也应该考虑V2,何况V2少了判断与移动轴,效率更高!
分享到:
相关推荐
人力资源管理软件其他的一些优化(部门结构自动设置顺序码、部门在岗位管理里的刷新、民族排序等)(感谢梦想成真和其他朋友) 2008-03-26 人力资源管理软件做了以下改进 解决了多公司情况下部门显示不正常的漏洞...
超级列表快速排序(2.0).zip 超级列表框补丁1.0(1.0).zip 传奇世界登陆模块(1.9).zip 磁性窗口模块V2.0(1.0).zip 磁性窗口模块V1.0(1.0).zip 磁盘格式化模块(1.0).zip 程序是否运行2(1.0).zip 程序自杀(1.0).zip 窗口...
《商业编程-源码-魔力门户(MolyX Portal) v2.0 Beta 3》是一个专注于企业级应用的开源项目,旨在提供一个高度可定制、功能强大的门户平台。MolyX Portal是一款基于Java技术栈的Web应用程序,它集成了各种模块和服务...
《labuladong的刷题笔记V2.0(力扣版)》是一份详尽的编程学习资源,主要针对LeetCode这个在线编程挑战平台。LeetCode是许多程序员提升技能、准备面试的重要工具,它提供了丰富的算法题目,涵盖数据结构、排序、搜索、...
书中可能包含了常见的排序算法(如快速排序、归并排序)、搜索算法(如二分查找、深度优先搜索)、图论问题(如最短路径算法、最小生成树)以及动态规划等核心概念。此外,它也可能讨论了如何优化代码效率,如何使用...
超级列表快速排序(2.0).zip 超级列表框补丁1.0(1.0).zip 传奇世界登陆模块(1.9).zip 磁性窗口模块V2.0(1.0).zip 磁性窗口模块V1.0(1.0).zip 磁盘格式化模块(1.0).zip 程序是否运行2(1.0).zip 程序自杀(1.0)....
总的来说,"时代购物系统 V2.0功能无限制版(带论坛)"是一个强大且全面的电商工具,不仅能满足商家对店铺日常运营的需求,还能提供优质的用户体验,推动电子商务的快速发展。无论你是初创的电商企业还是已有一定规模...
综上所述,"基于ASP的笑话分享程序(触屏版)v2.0"是一个为移动设备设计的动态网站应用,利用ASP技术实现用户交互和数据处理,提供丰富的笑话内容,并通过合理的数据库设计和安全措施,为用户提供便捷、安全的使用...
1、SDK开发包包括:动态... 4)快速排序 5)前缀匹配 6)中文分词 7)关键词过滤 8)ip路由 9)中文输入法 10)消息路由 11)消息队列 12)超大规模时钟 13)内存数据表 14)内存目录数据结构 15)域名解析
在Lucene.Net 2.0中,这些功能被封装在易于使用的API中,使得开发人员能够快速集成全文搜索到他们的应用中。 二、索引构建 在Lucene.Net中,索引是通过Analyzer、Document和Field三个关键组件构建的。Analyzer负责...
程序名称: 深度学习(asp.Net)留言板 v0.1.0 软件类别: asp.Net源码 / 留言 软件语言: 简体中文 授权方式: 免费版 系统平台: asp.Net2.0+ACCESS 程序下载: http://www.DeepTeach.com/ 程序演示: ...
《Milogs工作日志管理软件 V2.0 注册版》是一款专为用户设计的日志管理工具,旨在帮助用户高效地记录、整理和追踪工作日志。该软件提供了丰富的功能,使得日志管理工作变得轻松而有序,从而提高工作效率,便于个人或...
01) 易用: 支持快速重命名、下载、删除、编辑文件,友好轻松的文件选择,目录浏览记录,齐全的排序属性等。 02) 快速: 基于FTP命令响应操作,避免来回不停CWD与MLSD请求列表,接收数据, 使用AMFTP移动文件与设置...
盟威Access快速开发平台V2.5.1版(64位)** 盟威Access快速开发平台是一款专门针对ACCESS开发的增强工具,它在原生ACCESS的基础上增加了许多实用功能,旨在提高开发效率和应用性能。 - **模板库**:提供多种预设的...
Vlogempire v2.0 是一款专为创建和管理高速Vlog(视频博客)而设计的程序。这款软件提供了全面的功能,旨在帮助用户高效地制作、上传和分享他们的视频内容,同时也支持优化Vlog的性能,以确保流畅的用户体验。 在...
数据助手V2.0允许用户通过设定不同的条件,如字段值、范围、精确匹配等,快速定位到所需的数据。这在日常的数据分析、数据清洗或者问题排查工作中非常有用。此外,该软件可能还具备排序、筛选、统计等功能,帮助用户...
CAD表格转Excel工具能够快速、准确地将这些数据提取出来,转化为Excel工作簿,方便进行计算、排序和图表制作。 该工具的版本号v2.0.1.0表明它已经历了一次重要的更新,可能包括性能优化、错误修复、新功能添加等...
'v' => '2.0', 'fields' => 'tid, buyer_nick, seller_nick, created', 'tid' => $orderId ); ksort($params); // 按键名排序,确保签名生成一致性 $query = http_build_query($params); $sign = md5($this-...