一道面试题:按照其描述要求用java语言实现快速排序
回来想了想,写出了如下的程序:
/**
* 一道面试题,按照其描述要求进行快速排序(英文的,希望理解是对的。。)
* 要求:和一般的快速排序算法不同的是,它不是依次交换pivot和左右元素节点(交换2次),而是交换pivot左边的元素和pivot右边的元素。
*
* 自己笔写的程序大体上是正确的,但是递归的结束条件没有处理好(我当时写的是返回的i索引值大于0)。
* 递归的结束条件???
*
* 现在看看代码,实际运行了,感觉返回的i索引值大于0这个递归结束条件真的是不对的,因为可能一次排序后根本没有改变任何元素位置,这样i的值是不会发生改变的
*
* 这里想到一个递归结束的办法是:如果对整个数组进行快速排序以及pivot左右两部分的快速排序没有交换元素,则认为数组已经有序,结束递归!!!
* @author win7
*
*/
public class TestQuickSort {
static int[] a = {7,3,33,58,8,9,38,7,9};
static boolean allSortedFlag = true;
static int quickSort(int start, int end, int[] array) {
int i = start;
int j = end;
int pivot = a[start + (end - start) / 2 ];
System.out.println("pivot:" + pivot);
while(i <= j){
while(a[i] < pivot) { i++; }
while(a[j] > pivot) { j--; }
// printArray(a);
if(i <= j && a[i] > a[j]) { swapvalue(a, i, j); }
// printArray(a);
i++;
j--;
}
printArray(a);
System.out.println("--------------------------------------------------");
return i;
} private static void printArray(int[] a2) {
for (int i = 0; i < a2.length; i++) {
System.out.print(a2[i] + " ");
}
System.out.println();
}
private static void swapvalue(int[] array, int i, int j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
allSortedFlag = false;
} public static void main(String[] args) {
// int middle = 4;
// while(middle > 0) {
// middle = quickSort(0, a.length - 1, a);
// quickSort(0, middle - 1, a);
// quickSort(middle, a.length - 1, a);
// }
allSortedFlag = false;
while(!allSortedFlag) {
allSortedFlag = true;
int middle = quickSort(0, a.length - 1, a);
quickSort(0, middle - 1, a);
quickSort(middle, a.length - 1, a);
}
}
}
一点感觉:递归的使用的难点在于如何结束递归。上面的处理可能不太好。
参考自己另一篇的随笔(但是参考网上的代码写的),http://www.cnblogs.com/wenwujuncheng/p/3390780.html,感觉那样处理递归的结束比较好!
一道面试题:按照其描述要求用java语言实现快速排序的更多相关文章
- 一道面试题:C++相比C#或者java的优势到底在哪里
被问到了这样一道面试题,当时就懵了,内心一直觉得C++肯定在很多方面要比C#或者java要牛b的. 但是真的不知道怎么回答. 问题是:你以前一直做得是.NET相关项目,现在为什么找C++开发相关工作呢 ...
- 「每天一道面试题」Java类的生命周期包括哪几个阶段?
一个Java类被加载到虚拟机中,它的生命周期才算开始,直到被从内存中卸载,它的生命周期才算结束.从开始到结束,它的整个生命周期包括加载.验证.准备.解析.初始化.使用和卸载7个阶段,其中验证.准备和解 ...
- 关于Java类加载双亲委派机制的思考(附一道面试题)
预定义类加载器和双亲委派机制 JVM预定义的三种类型类加载器: 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib下面 ...
- 一道面试题引发的对 Java 内存模型的一点疑问
一道面试题引发的对Java内存模型的一点疑问 问题描述 如上图所示程序,按道理,子线程会通过 num++ 操作破坏 while 循环的条件,从而终止循环,执行最后的输出操作.但在我的多次运行中,偶尔会 ...
- 【死磕JVM】一道面试题引发的“栈帧”!!!
前言 最近小农的朋友--小勇在找工作,开年来金三银四,都想跳一跳,找个踏(gao)实(xin)点的工作,这不小勇也去面试了,不得不说,现在面试,各种底层各种原理,层出不穷,小勇就遇上了这么一道面试题, ...
- 从一道面试题来认识java类加载时机与过程
说明:本文的内容是看了<深入理解Java虚拟机:JVM高级特性与最佳实践>后为加印象和理解,便记录了重要的内容. 1 开门见山 以前曾经看到过一个java的面试题,当时觉得此题很简单,可 ...
- PHP递归创建多级目录(一道面试题的解题过程)
今天看到一道面试题,要写出一个可以创建多级目录的函数: 我的第一个感觉就是用递归创建,具体思路如下: function Directory($dir){ if(is_dir($dir) || @mkd ...
- 一道面试题比较synchronized和读写锁
一.科普定义 这篇博文的两个主角“synchronized”和“读写锁” 1)synchronized 这个同步关键字相信大家都用得比较多,在上一篇“多个线程之间共享数据的方式”中也详细列举他的应用, ...
- <转>一道面试题比较synchronized和读写锁
一.科普定义(原文:http://903497571.iteye.com/blog/1874752) 这篇博文的两个主角“synchronized”和“读写锁” 1)synchronized 这个同步 ...
随机推荐
- electron小例子
说明:该例子主要实现把输入框中的文字保存到本地的文本文档中. 在main中添加几句代码 const ipcMain = electron.ipcMain; const dialog = electro ...
- Ubuntu 安装 Redis
1. 下载并安装 redis 2.6.16版 sudo mkdir /usr/local/src/Redis cd /usr/local/src/Redis sudo wget http://down ...
- js判断是不是chrome浏览器
方法一: var isChrome = window.navigator.userAgent.indexOf("Chrome"); <script> var isChr ...
- Java线程与多线程教程
本文由 ImportNew - liken 翻译自 Journaldev. Java线程是执行某些任务的轻量级进程.Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程. 应用 ...
- HTML5自学笔记[ 12 ]canvas绘图小示例之鼠标画线
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- CentOS 7.x安装配置
简述 VMware可以创建多个虚拟机,每个虚拟机上都可以安装各种类型的操作系统.安装方法也有很多种.下面,主要以ISO镜像安装为例,介绍CentOS 7.x的安装过程及相关的参数设置. 简述 创建虚拟 ...
- Java基础:多线程
基本概念 程序&线程&进程 程序是一个段可以提供业务功能的代码,它可以包含1个或多个进程.程序在OS上运行时表现为进程对各种资源(CPU,内存,Disk..)的消耗和处理. 进程是OS ...
- JMeter基础知识
JMeter介绍 JMeter是开源的性能测试工具和接口测试工具,工作原理和Loadrunner一样:作为浏览器和WebServer之间的网关,捕获Browser请求和WebServer响应,然后通过 ...
- SSH基础(2)
linux下配置 ssh运行的参数详解:
- poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)
题目链接:poj1122 FDNY to the Rescue! 题意:给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路口之间没有直接路径,再给 ...