一道面试题:按照其描述要求用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 这个同步 ...
随机推荐
- JavaScript document
window -- document用于表现HTML页面当前窗体的内容 document,中文"文档" document是BOM中最重要对象之一 document对象是window ...
- 初识Ildasm.exe——IL反编译的实用工具
原文地址:http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html Ildasm.exe 概要: 一.前言: 微软的IL反 ...
- JavaScript:闭包
根据MDN上的解释『闭包是指函数有自由独立的变量.换句话说,定义在闭包中的函数可以“记忆”它创建时候的环境.』 闭包有两个主要的作用: 1.访问内部函数的局域变量: 2.将创建的变量永久保存在内存中, ...
- Junit4入门
eclipse自带junit包,可右键直接新建junit类 静态引入:import static org.junit.Assert.* assert.*是类,静态引入会引入assert里的所有静态方法 ...
- Java构造函数的继承问题
◎构造函数的继承 1.子类只继承父类的默认(缺省)构造函数,即无形参构造函数.如果父类没有默认构造函数,那子类不能从父类继承到任何构造函数. 3.在创建对象时,先调用父类默认构造函数对对象进行初始化, ...
- javaSE基础之记事本编程
首先安装好jdk和jre,之后进行如下操作: 1. 将代码记事本---->cmd--->javac 文件名.java ----->java 文件名 如图: 2. 关于记事本文件属性的 ...
- 获取txt文件指定行内容
#!/usr/bin/python num=0; ni=open("C:\Python34\ceshi.txt") for line in ni: num=num+1; #表示行 ...
- jquery mobile 请求数据方法执行时显示加载中提示框
在jquery mobile开发中,经常需要调用ajax方法,异步获取数据,如果异步获取数据方法由于网速等等的原因,会有一个反应时间,如果能在点击按钮后数据处理期间,给一个正在加载的提示,客户体验会更 ...
- 数组作为hash元素的时候如何push
####################################################################### # Copyright (C) 2015 All rig ...
- [转]Java程序员们最常犯的10个错误
1.将数组转化为列表 将数组转化为一个列表时,程序员们经常这样做: List<String> list = Arrays.asList(arr); Arrays.asList()会返回一个 ...