如果in-place做quick sort,选择放置pivot的位置会影响到代码细节。
同样的实现方式,选择第一个元素为pivot时,恢复pivot位置就得以hi为准。
public class TestQuickSort {
public static void main(String[] args) {
int[] arr = { 1, 4, 2, 3, 6, 5, 0 };
quickSort(arr, 0, arr.length - 1);
for (int i : arr) System.out.println(i);
}
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) return;
int pivot = arr[left];
int lo = left;
int hi = right + 1;
while (true) {
while (arr[++lo] < pivot) { if (lo == right) break; }
while (arr[--hi] > pivot) { }
if (lo >= hi) break;
swap(arr, lo, hi);
}
swap(arr, left, hi);
quickSort(arr, left, hi - 1);
quickSort(arr, hi + 1, right);
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
反之,以最后一个元素为pivot时,恢复pivot就得以lo为准。
public class TestQuickSort {
public static void main(String[] args) {
int[] arr = { 1, 4, 2, 3, 6, 5, 0 };
quickSort(arr, 0, arr.length - 1);
for (int i : arr) System.out.println(i);
}
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) return;
int pivot = arr[right];
int lo = left - 1;
int hi = right;
while (true) {
while (arr[++lo] < pivot) { }
while (arr[--hi] > pivot) { if (hi == left) break; }
if (lo >= hi) break;
swap(arr, lo, hi);
}
swap(arr, right, lo);
quickSort(arr, left, lo - 1);
quickSort(arr, lo + 1, right);
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
这是因为这种实现方式中,在选取恢复pivot的下标时,应选取“安全”的那个,也就是永远不会超过pivot所在位置的那个。
如果选取中间的元素为pivot,则无需恢复pivot,而且无论以lo还是hi为基准继续快排都行,因为在满足循环的结束条件时它们肯定相等。
public class TestQuickSort {
public static void main(String[] args) {
int[] arr = { 1, 4, 2, 3, 6, 5, 0 };
quickSort(arr, 0, arr.length - 1);
for (int i : arr) System.out.println(i);
}
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) return;
int pivot = arr[(left + right) / 2];
int lo = left - 1;
int hi = right + 1;
while (true) {
while (arr[++lo] < pivot) { }
while (arr[--hi] > pivot) { }
if (lo >= hi) break;
swap(arr, i, j);
}
quickSort(arr, left, lo - 1);
quickSort(arr, lo + 1, right);
}
public static void swap(int[] arr, int i, int j) {
System.out.println("swap " + i + " with " + j);
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
分享到:
相关推荐
### Java引用变量传递诡异之处详解 #### 背景与问题描述 在Java编程语言中,对于引用类型变量的理解及其实现方式一直是开发者们容易混淆的地方。尤其是当涉及到方法调用过程中引用变量的传递时,更是如此。本文将...
易语言源码诡异心理游戏易语言源码.rar 易语言源码诡异心理游戏易语言源码.rar 易语言源码诡异心理游戏易语言源码.rar 易语言源码诡异心理游戏易语言源码.rar 易语言源码诡异心理游戏易语言源码.rar 易语言源码...
根据给定的信息,这篇代码是针对杭电OJ(Online Judge)平台上的1180题——“诡异的楼梯”的解题报告。该题目通过一个迷宫类问题,考察了广度优先搜索(BFS)算法的应用。接下来,我们将详细解析这段C++代码中的关键...
《易语言诡异心理游戏》是一款基于易语言开发的心理游戏,其独特之处在于它结合了编程技术和心理学原理,为玩家提供了一种新颖的游戏体验。易语言是中国本土开发的一种简单易学的编程语言,旨在降低编程门槛,让普通...
今天小编就为大家分享一篇C语言switch使用之诡异用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
【故障处理】BLOG_DBCA建库诡异问题处理--rac环境不能创建rac库.pdf【故障处理】BLOG_DBCA建库诡异问题处理--rac环境不能创建rac库.pdf
语言:English,中文 (简体) 诡异通道为Google Chrome浏览器定制的扩展程序 使用不通国家服务器的中转,来达到访问不通国家网站的速度的大幅提升。
浅谈SpringMVC HandlerInterceptor诡异问题排查 SpringMVC中的HandlerInterceptor是非常重要的组件之一,它可以在请求处理的各个阶段进行干预和修改。本文将主要介绍如何排查SpringMVC HandlerInterceptor中的诡异...
《诡异漫画手机版 v1.0.22》是一款专为安卓用户设计的电子图书应用,主要专注于提供各类诡异、惊悚、恐怖题材的漫画资源,让读者在移动设备上享受独特的阅读体验。作为一款社交聊天类应用,它还集成了互动功能,允许...
在诡异文本框特效中,可能会使用SVG元素来创建南瓜灯、鬼魂或其他万圣节图标。 4. **Web Storage**: HTML5提供了localStorage和sessionStorage,使得网页可以存储数据在本地,增强用户体验。此特效可能利用Web ...
在本文中,我们将深入探讨`CTabCtrl`的使用以及可能遇到的一些诡异实例。 1. **`CTabCtrl`的基本用法** - 创建`CTabCtrl`:在对话框或视图类中,可以通过在资源编辑器中添加一个`TCN`类型的消息控件,并在代码中将...
例如,当角色进入森林场景时,可以设置一个事件来播放"诡异的风",让玩家仿佛置身于一片阴森的树林之中。 少儿编程教育通过Scratch教授孩子们基础的编程概念,如条件语句、循环、函数等,同时结合视觉和听觉元素,...
### Oracle排错 DBCA建库诡异问题处理--rac环境不能创建rac库 #### 故障处理概述 本文主要探讨了在Oracle RAC环境中利用DBCA(Database Configuration Assistant)工具进行数据库创建时遇到的一个特殊问题——无法...
"黑暗诡异的环境"这一主题音效,是专门为营造一种神秘、不祥或者紧张氛围而设计的。在Scratch项目中,这样的音效可能被用在恐怖游戏、冒险探索或解谜类游戏中,当角色进入未知地带或者遭遇危险情况时播放,以增加...
在Windows Presentation Foundation(WPF)开发中,遇到“加载诡异的字体无法布局”的问题时,开发者通常会面临一些挑战。WPF是一个强大的UI框架,它允许我们创建丰富的、交互式的桌面应用程序,包括对各种字体的...