Java 笔试面试 算法编程篇 一

1
/* **********************************************************************************
1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,
a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。
*************************************************************************************/
答:
package com.example;
 
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.net.URLDecoder;
 
public class example1 {
    public static void main(String[] args) throws Exception {
        FileManager m1 = new FileManager("a.txt", new char[]{'\n'});
        FileManager m2 = new FileManager("b.txt", new char[]{'\n', ' '});
        FileWriter c = new FileWriter("c.txt");
        String aWord = null;
        String bWord = null;
        while((aWord = m1.nextWord()) != null){
            c.write(aWord + "\n");
            bWord = m2.nextWord();
            if(bWord != null){
                c.write(bWord + "\n");
            }
        }
        while((bWord = m2.nextWord()) != null){
            c.write(bWord + "\n");
        }
        c.close();
    }
}
 
 
class FileManager{
    String[] words = null;
    int pos = 0;
    public FileManager(String filename, char[] seperators) throws Exception{
//      ClassLoader.getSystemResource("") //file:\D:\Coding_Project\eclipse2\Java面试问题集\Chapter2\bin\a.txt
//      this.getClass().getResource("").getPath()    // /D:/Coding_Project/eclipse2/Java面试问题集/Chapter2/bin/com/example/
//      System.out.println(URLDecoder.decode(this.getClass().getResource("/").getPath(),"UTF-8"));
        filename=this.getClass().getResource("/").getPath() + filename;
        filename=URLDecoder.decode(filename,"UTF-8");   //中文路径问题
        File f = new File(filename);
        FileReader reader = new FileReader(f);
        char[] buf = new char[(int)f.length()];
        int len = reader.read(buf);
        String results = new String(buf, 0, len);
        String regex = null;
        if(seperators.length > 1){
            regex = "" + seperators[0] + "|" + seperators[1];
        }else{
            regex = "" + seperators[0];
        }
        words = results.split(regex);
        reader.close();
//      System.out.println();
    }
   
    public String nextWord(){
        if(pos == words.length){
            return null;
        }
        return words[pos++];
    }
}
 
FilenameFilter
一、FilenameFilter介绍
 
Java.io.FilenameFilter是文件名过滤器,用来过滤不符合规格的文件名,并返回合格的文件;
一般地:
(1)String[] fs = f.list();
(2)File[] fs = f.listFiles();
这两个方法返回f下的所有文件或目录;
FilenameFilter用来把符合要求的文件或目录返回;
因此可以调用:
(1)String []fs = f.list(FilenameFilter filter);;
(2)File[]fs = f.listFiles(FilenameFilter filter);
 
二、文件名过滤器一般用法
 
1.实现FilenameFilter接口;
2.实现boolean accept(File dir,String name);   //dir表示文件的当前目录,name表示文件名;
class MyFilter implements FilenameFilter{
private String type;            //type为需要过滤的条件,比如如果type=".jpg",则只能返回后缀为jpg的文件
public MyFilter(String type){
this.type = type;
}
public boolean accept(File dir,String name){           //返回true的文件则合格
}
}
 
三、实例   
 
要求:返回当前目录下所有以.java结尾的文件;
package org.exam5a;
 
import java.io.File;
import java.io.FilenameFilter;
 
public class T4 {
 
    public static void main(String[] args)throws Exception {
        File f = new File(".");
        MyFilter filter = new MyFilter(".java");
        String[] files = f.list(filter);
        for(String a:files){
            System.out.println(a);
        }
    }
    static class MyFilter implements FilenameFilter{
        private String type;
        public MyFilter(String type){
            this.type = type;
        }
        public boolean accept(File dir,String name){
            return name.endsWith(type);
        }
    }
}
 
2
/* **********************************************************************************
2、编写一个程序,将d:\java 目录下的所有.java 文件复制到d:\temp 目录下,并
将原来文件的扩展名从.java 改为.temp
*************************************************************************************/
package com.example;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
public class example2 {
    public static void main(String[] args) throws Exception {
        java2temp jt = new java2temp();
        jt.transfer();
    }
}
 
class java2temp {
//  String srcPath = URLDecoder.decode(this.getClass().getResource("/").getPath(),"UTF-8");
    public void transfer() throws Exception{
//      System.getProperty("user.dir") + "\\src"; //  D:\Coding_Project\eclipse2\Java面试问题集\Chapter2\src
//      String srcPath = URLDecoder.decode(this.getClass().getResource("/").getPath(),"UTF-8");  // /D:/Coding_Project/eclipse2/Java面试问题集/Chapter2/bin/
        String srcPath = System.getProperty("user.dir") + "\\src\\com\\example";
        String desPath = srcPath + "\\temp";
        System.out.println(srcPath+"\n"+desPath);
        File srcDir = new File(srcPath);
        if(!(srcDir.exists() && srcDir.isDirectory())){
            throw new Exception("directory doesn't exist");
        }
        File[] files = srcDir.listFiles(
            new FilenameFilter() {
               
                @Override
                public boolean accept(File dir, String name) {
                    // TODO Auto-generated method stub
                    return name.endsWith(".java");
                }
            }  
        );
        System.out.println(files.length);
       
        File desDir = new File(desPath);
        if(!desDir.exists()){
            desDir.mkdirs();
        }
        for(File f : files){
            FileInputStream fis = new FileInputStream(f);
            String destFilename = f.getName().replaceAll("\\.java$", ".temp");
            FileOutputStream fos = new FileOutputStream(new File(desDir, destFilename));
            copy(fis, fos);
            fis.close();
            fos.close();
        }
    }
    private void copy(InputStream ips, OutputStream ops) throws IOException{
        int len = 0;
        byte[] buf = new byte[1024];
        while((len = ips.read(buf)) != -1){
            ops.write(buf, 0, len);
        }
    }
}
 
 
不同编码英文字母和中文汉字所占字节。
GBK的编码是一个汉字两个字节,范围是第一个字节大于128开始,第二个字节从大于64开始。
第一个字节大于127就表示这是个汉字的开始。
byte这种类型只有java有,范围是-127到127.所以打印出来转换了就变成负数了。
 
import java.io.UnsupportedEncodingException;  
 
public class EncodeTest {  
    /** 
     * 打印字符串在指定编码下的字节数和编码名称到控制台
     *  
     * @param s 
     *            字符串
     * @param encodingName
     *            编码格式
     */ 
    public static void printByteLength(String s, String encodingName) {  
        System.out.print("字节数:");  
        try {  
            System.out.print(s.getBytes(encodingName).length);  
        } catch (UnsupportedEncodingException e) {  
            e.printStackTrace();  
        }  
        System.out.println(";编码:" + encodingName);  
    }  
 
    public static void main(String[] args) {  
        String en = "A";  
        String ch = "人";  
 
        // 计算一个英文字母在各种编码下的字节数 
        System.out.println("英文字母:" + en);  
        EncodeTest.printByteLength(en, "GB2312");  
        EncodeTest.printByteLength(en, "GBK");  
        EncodeTest.printByteLength(en, "GB18030");  
        EncodeTest.printByteLength(en, "ISO-8859-1");  
        EncodeTest.printByteLength(en, "UTF-8");  
        EncodeTest.printByteLength(en, "UTF-16");  
        EncodeTest.printByteLength(en, "UTF-16BE");  
        EncodeTest.printByteLength(en, "UTF-16LE");  
 
        System.out.println();  
 
        // 计算一个中文汉字在各种编码下的字节数 
        System.out.println("中文汉字:" + ch);  
        EncodeTest.printByteLength(ch, "GB2312");  
        EncodeTest.printByteLength(ch, "GBK");  
        EncodeTest.printByteLength(ch, "GB18030");  
        EncodeTest.printByteLength(ch, "ISO-8859-1");  
        EncodeTest.printByteLength(ch, "UTF-8");  
        EncodeTest.printByteLength(ch, "UTF-16");  
        EncodeTest.printByteLength(ch, "UTF-16BE");  
        EncodeTest.printByteLength(ch, "UTF-16LE");  
    }  
} 
 
运行结果如下:
 
英文字母:A
字节数:1;编码:GB2312
字节数:1;编码:GBK
字节数:1;编码:GB18030
字节数:1;编码:ISO-8859-1
字节数:1;编码:UTF-8
字节数:4;编码:UTF-16
字节数:2;编码:UTF-16BE
字节数:2;编码:UTF-16LE
中文汉字:人
字节数:2;编码:GB2312
字节数:2;编码:GBK
字节数:2;编码:GB18030
字节数:1;编码:ISO-8859-1
字节数:3;编码:UTF-8
字节数:4;编码:UTF-16
字节数:2;编码:UTF-16BE
字节数:2;编码:UTF-16LE
 
编码范围
//      1. GBK (GB2312/GB18030)
//      x00-xff GBK双字节编码范围
//      x20-x7f ASCII
//      xa1-xff 中文
//      x80-xff 中文
//
//      2. UTF-8 (Unicode)
//      u4e00-u9fa5 (中文)
//      x3130-x318F (韩文)
//      xAC00-xD7A3 (韩文)
//      u0800-u4e00 (日文)
 
 
3
/* **********************************************************************************
3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,
但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,
输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。
*************************************************************************************/
package com.example;
 
import java.io.UnsupportedEncodingException;
 
public class example3 {
    public static void main(String[] args) throws Exception {
        String str = "你abc好";
        trimGBK(str, 6);
    }
   
    public static void trimGBK(String str, int n) throws UnsupportedEncodingException{
        byte[] buf = str.getBytes("GBK");
        boolean bChineseFirstHalf = false;
        int num = 0;
       
//      GBK的编码是一个汉字两个字节,范围是第一个字节大于128开始,第二个字节从大于64开始。
//      第一个字节大于127就表示这是个汉字的开始。
//      byte这种类型只有java有,范围是-127到127.所以打印出来转换了就变成负数了。
//      编码范围
//      1. GBK (GB2312/GB18030)
//      x00-xff GBK双字节编码范围
//      x20-x7f ASCII  -- 英文为正数
//      xa1-xff 中文    -- 中文为负数
//      x80-xff 中文
//
//      2. UTF-8 (Unicode)
//      u4e00-u9fa5 (中文)
//      x3130-x318F (韩文)
//      xAC00-xD7A3 (韩文)
//      u0800-u4e00 (日文)
        for(int i = 0; i < n; i++){
            if(buf[i] < 0 && !bChineseFirstHalf){
                bChineseFirstHalf = true;
            }else{
                num++;
                bChineseFirstHalf = false;
            }
        }
        System.out.println(str.substring(0, num));
    }
}
 
 
4
/* **********************************************************************************
4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。
*************************************************************************************/
package com.example;
 
import java.util.HashMap;
import java.util.Map;
 
public class example4 {
    public static void main(String[] args) throws Exception {
        String str = "中国aadf的111萨bbb菲的zz萨菲";
        char[] strArr = str.toCharArray();
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        Integer num = 0;
        for(char c : strArr){
            num = map.get(c);
            if(num == null){
                num = 1;
            }
            else{
                num = num + 1;
            }
            map.put(c, num);
        }
        for(Map.Entry<Character, Integer> entry : map.entrySet()){
            System.out.println(entry.getKey() + "\t: " + entry.getValue());
        }
    }
   
}
 
//结果
f   : 1
菲  : 2
1   : 3
d   : 1
b   : 3
的  : 2
a   : 2
中  : 1
萨  : 2
国  : 1
z   : 2
 
5 二叉树
/* **********************************************************************************
5、说明生活中遇到的二叉树,用java 实现二叉树
答: 二叉查找树
*************************************************************************************/
package com.example;
 
import java.util.Arrays;
import java.util.HashMap;
 
public class example5 {
    public static void main(String[] args) throws Exception {
        int[] data = new int[10];
        HashMap<Integer, Boolean> map = new HashMap<>();
        for(int i=0; i<data.length; i++){
            int tmp = (int)(Math.random() * 100 + 1);
            while(map.get(tmp) != null){
                tmp = (int)(Math.random() * 100 + 1);
            }
 
            data[i] = tmp;
            map.put(tmp, true);
        }
       
        System.out.println(Arrays.toString(data));
        BinaryTree root = new BinaryTree(data[0]);
        for(int i : data){
            if(i != data[0]){
//              System.out.print(i + " ");
                root.add(i);
            }
        }
       
        System.out.println("先序:");
        root.preOrderTraverse();
        System.out.println();
       
        System.out.println("中序:");
        root.midOrderTraverse();
        System.out.println();
       
        System.out.println("非递归中序:");
        root.midOrderTraverse2();
        System.out.println();
       
        System.out.println("后序:");
        root.postOrderTraverse();
        System.out.println();
    }
   
}
 
 
class BinaryTree{
    private int value;
    private BinaryTree lChild;
    private BinaryTree rChild;
   
    public BinaryTree(){
       
    }
   
    public BinaryTree(int value){
        this.value = value;
    }
   
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        StringBuilder sb = new StringBuilder();
        sb.append(value);
        return sb.toString();
    }
 
    public void add(int value){
        if(value < this.value){
            if(this.lChild == null){
                lChild = new BinaryTree();
                lChild.value = value;
            }else{
                lChild.add(value);
            }
           
        }else if(value > this.value){
            if(this.rChild == null){
                this.rChild = new BinaryTree();
                rChild.value = value;
            }else{
                rChild.add(value);
            }
        }
    }
   
    public boolean isExist(int value){
        if(this.value == value){
            return true;
        }else if(value < this.value){
            if(this.lChild == null){
                return false;
            }else{
                return lChild.isExist(value);
            }
        }else{
            if(null == this.rChild){
                return false;
            }else{
                return rChild.isExist(value);
            }
        }
    }
   
    public void preOrderTraverse(){
        System.out.print(this.value + ",");
        if(null != lChild)
            lChild.preOrderTraverse();
        if(null != rChild)
            rChild.preOrderTraverse();
    }
   
    public void midOrderTraverse(){
        if(null != lChild)
            lChild.midOrderTraverse();
        System.out.print(this.value + ",");
        if(null != rChild)
            rChild.midOrderTraverse();
    }
   
    //非递归中序
    public void midOrderTraverse2(){ 
        MyArrayStack<BinaryTree> s = new MyArrayStack<BinaryTree>();
        BinaryTree tmp = this;
        while((null != tmp) || !s.isEmpty()){
            if(null != tmp){
                s.push(tmp);
                tmp = tmp.lChild;
            }else{
                BinaryTree tmp2 = s.pop();
                System.out.print(tmp2.value + ",");
                tmp = tmp2.rChild;
            }
            System.out.println(s.toString());
        }
    }
   
    public void postOrderTraverse(){
        if(null != lChild)
            lChild.postOrderTraverse();
        if(null != rChild)
            rChild.postOrderTraverse();
        System.out.print(this.value + ",");
    }
}
 
 
interface MyStack<T>{
    boolean isEmpty();
    void clear();
    int length();
    boolean push(T data);
    T pop();
}
 
class MyArrayStack<T> implements MyStack<T>{
    private Object[] objs = new Object[16];
    private int size = 0;
   
    @Override
    public boolean isEmpty() {
        return size == 0;
    }
    @Override
    public void clear() {
        // TODO Auto-generated method stub
        for (int i = 0; i < objs.length; i++) {
            objs[i] = null;
        }
        size = 0;
    }
    @Override
    public int length() {
        return size;
    }
    @Override
    public boolean push(T data) {
        if(size >= objs.length){
            resize();
        }
        objs[size++] = data;
        return true;
    }
    @SuppressWarnings("unchecked")
    @Override
    public T pop() {
        if(size <= 0){
            return null;
        }
        return (T)objs[--size];
    }
   
    public void resize(){
        Object[] tmp = new Object[objs.length * 3 / 2 + 1];
        for (int i = 0; i < objs.length; i++) {
            tmp[i] = objs[i];
            objs[i] = null;
        }
        objs=tmp;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
       
        StringBuilder sb = new StringBuilder();
        sb.append("MyArrayStack: [");
        for(int i=0; i<size; i++){
            sb.append(objs[i].toString());
            if(i != size - 1){
                sb.append(", ");
            }
        }
        sb.append("]");
        return sb.toString();
    }
   
}
 
6
/* **********************************************************************************
6.从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序:
1,张三,28
2,李四,35
3,张三,28
4,王五,35
5,张三,28
6,李四,35
7,赵六,28
8,田七,35
*************************************************************************************/
package com.example;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeSet;
import java.util.Iterator;
 
 
public class example6 {
    public static void main(String[] args) throws Exception {
        HashMap<String, Integer> results = new HashMap<String, Integer>();
       
        //文件在src路径下
        InputStream ips = example6.class.getResourceAsStream("/UserInfo.txt");
       
        //文件与类在相同的包下面,可以用相对路径
        //InputStream ips = example6.class.getResourceAsStream("UserInfo.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(ips));
        String line = null;
        try {
            while((line = br.readLine()) != null){
//              System.out.println(line + "aa");
                dealLine(line, results);
            }
            sortResults(results);
        } catch (IOException e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
   
    static class User{
        public String name;
        public Integer value;
        public User(String name, Integer value) {
            super();
            this.name = name;
            this.value = value;
        }
        @Override
        public boolean equals(Object obj) {
            // TODO Auto-generated method stub
            //下面的代码没有执行,说明往treeset 中增加数据时,不会使用到equals 方法。
            System.out.println(super.equals(obj));
            return super.equals(obj);
        }
       
    }
   
    public static void sortResults(Map<String, Integer> results){
        TreeSet<Object> sortedResults = new TreeSet<Object>(new Comparator<Object>() {
            public int compare(Object o1, Object o2) {
                User u1 = (User)o1;
                User u2 = (User)o2;
               
                /*如果compareTo 返回结果0,则认为两个对象相等,新的对象不会增加到集合中去
                所以,不能直接用下面的代码,否则,那些个数相同的其他姓名就打印不出来。
                * */
//              return u1.value-u2.value;
//              return u1.value<u2.value?-1:u1.value==u2.value?0:1;
                if(u1.value > u2.value){
                    return 1;
                }
                if(u1.value < u2.value){
                    return -1;
                }
                return u1.name.compareTo(u2.name);
            };
        });
       
        @SuppressWarnings("rawtypes")
        Iterator iter = results.keySet().iterator();
        while(iter.hasNext()){
            String name = (String)iter.next();
            Integer value = (Integer) results.get(name);
            if(value > 1){
                sortedResults.add(new User(name, value));
            }
        }
        printResults(sortedResults);
    }
   
    public static void dealLine(String line, Map<String, Integer> map){
        if(!"".equals(line.trim())){
            String[] results = line.split(",");
            if(results.length == 3){
                String name = results[1];
                Integer value = (Integer)map.get(name);
                if(null == value){
                    value = 0;
                }
                map.put(name, value + 1);
            }
        }
    }
   
    @SuppressWarnings({ "rawtypes" })
    private static void printResults(TreeSet sortedResults){
        Iterator iter = sortedResults.iterator();
        while(iter.hasNext()){
            User u = (User)iter.next();
            System.out.println(u.name + ":" + u.value);
        }
    }
   
}
 
 
7
/* **********************************************************************************
递归算法题
一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n 的顺序递增,当值大于5000
时,把值按照指定顺序输出来。
例:n=1237
        则输出为:
        1237,
        2474,
        4948,
        9896,
        9896,
        4948,
        2474,
        1237,
        提示:写程序时,先致谢按递增方式的代码,写好递增的以后,再增加考虑递减部分。
*************************************************************************************/
package com.example;
 
 
public class example7 {
    public static void main(String[] args) throws Exception {
        doubleNum(1237);
    }
   
    public static void doubleNum(int n){
        System.out.println(n);
        if(n <= 5000){
            doubleNum(n * 2);
        }
        System.out.println(n);
    }
}
 
8
/* **********************************************************************************
递归算法题
第1个人10,第2个比第1个人大2岁,依次递推,请用递归方式计算出第8个人多大?
*************************************************************************************/
package cn.itcast;
import java.util.Date;
publicclass A1 {
    public static voidmain(String [] args) {
        System.out.println(computeAge(8));
    }
    public static int computeAge(int n) {
        if(n==1)return 10;
        return computeAge(n-1) + 2;
    }
}
 
9 将数组元素顺序颠倒
/* **********************************************************************************
有数组a[n],用java 代码将数组元素顺序颠倒
*************************************************************************************/
package com.example;
 
import java.util.Arrays;
 
public class example11 {
    public static void main(String[] args) throws Exception {
        int[] arr = new int[10];
        for(int i=1; i<arr.length; i++){
            arr[i] = (int)(Math.random() * 100 + 1);
        }
        System.out.println(Arrays.toString(arr));
        swap(arr);
        System.out.println(Arrays.toString(arr));
    }
   
    //用下面的也可以
    //for(inti=0,int j=a.length-1;i<j;i++,j--)是否等效于for(int i=0;i<a.length/2;i++)呢?
    public static void swap(int[] arr){
        int len = arr.length;
        for(int i=0; i<len/2; i++){
            int tmp = arr[i];
            arr[i] = arr[len - 1 - i];
            arr[len - 1 - i] = tmp;
        }
    }
}
 
10金额转换
/* **********************************************************************************
金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。
*************************************************************************************/
package com.example;
 
public class example12 {
    private static final char[] data = new char[] {
            '零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};
        private static final char[] units = new char[] {
            '元','拾','佰','仟','万','拾','佰','仟','亿'};
       
    public static void main(String[] args) throws Exception {
        System.out.println(convert(135009003));
    }
   
    public static String convert(int money) {
        StringBuffer sbf = new StringBuffer();
        int unit = 0;
        while(money!=0) {
            sbf.insert(0,units[unit++]);
            int number = money%10;
            sbf.insert(0,data[number]);
            money/= 10;
        }
//      return sbf.toString();
        //去零,正则表达式
        return sbf.toString().toString().replaceAll("零[拾佰仟]","零").
replaceAll("零+万","万").replaceAll("零+元","元").replaceAll("零+","零");
    }
}
 
//135009003
//不去零 : 壹亿叁仟伍佰零拾零万玖仟零佰零拾叁元
//结果 : 壹亿叁仟伍佰万玖仟零叁元
 
 
11请设计一个一百亿的计算器
 
二分查找法
二分查找又称折半查找,它是一种效率较高的查找方法。
二分查找要求:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。
    二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:
1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,
2.寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。
/**
 * 二分查找又称折半查找,它是一种效率较高的查找方法。 
  【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。
 * @author Administrator
 *
 */ 
public class BinarySearch {  
    public static void main(String[] args) { 
        int[] src = new int[] {1, 3, 5, 7, 8, 9};  
        System.out.println(binarySearch(src, 3)); 
        System.out.println(binarySearch(src,3,0,src.length-1)); 
    } 
 
    /**
     * * 二分查找<a href="http://lib.csdn.net/base/datastructure" class='replace_word' title="算法与数据结构知识库" target='_blank' style='color:#df3434; font-weight:bold;'>算法</a> * *
     * 
     * @param srcArray
     *            有序数组 *
     * @param des
     *            查找元素 *
     * @return des的数组下标,没找到返回-1
     */  
   public static int binarySearch(int[] srcArray, int des){  
     
        int low = 0;  
        int high = srcArray.length-1;  
        while(low <= high) {  
            int middle = (low + high)/2;  
            if(des == srcArray[middle]) {  
                return middle;  
            }else if(des <srcArray[middle]) {  
                high = middle - 1;  
            }else {  
                low = middle + 1;  
            } 
        } 
        return -1; 
   } 
       
      /**  
     *二分查找特定整数在整型数组中的位置(递归)  
     *@paramdataset  
     *@paramdata  
     *@parambeginIndex  
     *@paramendIndex  
     *@returnindex  
     */ 
    public static int binarySearch(int[] dataset,int data,int beginIndex,int endIndex){   
       int midIndex = (beginIndex+endIndex)/2;   
       if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){ 
           return -1;   
       } 
       if(data <dataset[midIndex]){   
           return binarySearch(dataset,data,beginIndex,midIndex-1);   
       }else if(data>dataset[midIndex]){   
           return binarySearch(dataset,data,midIndex+1,endIndex);   
       }else {   
           return midIndex;   
       }   
   }  
 
}
快速排序
/* **********************************************************************************
快速排序
3、实现思路。
 
1.以第一个关键字 K 1 为控制字,将 [K 1 ,K 2 ,…,K n ] 分成两个子区,
使左区所有关键字小于等于 K 1 ,右区所有关键字大于等于 K 1 ,
最后控制字居两个子区中间的适当位置。在子区内数据尚处于无序状态。
2.递归处理左右子区
*************************************************************************************/
package com.example;
 
import java.util.Arrays;
 
public class example8 {
    public static void main(String[] args) throws Exception {
        int[] arr = new int[10];
        for(int i = 0; i<arr.length; i++){
            arr[i] = (int)(Math.random() * 100 + 1);
        }
        System.out.println(Arrays.toString(arr));
        quickSort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));   //数组被改变
    }
   
    public static void quickSort(int[] arr, int left, int right){
        if(left < right){
            int pivotloc = partition(arr, left, right);
//          System.out.print(left + ":" + right);           //left , right 不变
//          System.out.println(Arrays.toString(arr));       //数组被改变
            quickSort(arr, left, pivotloc - 1);
            quickSort(arr, pivotloc + 1, right);
        }
    }
   
    public static int partition(int[] arr, int left, int right){
        int pivotkey = arr[left];
       
        while(left < right){
            while(left < right && pivotkey <= arr[right]) right--;
            if(left < right) arr[left++] = arr[right];
            while(left < right && pivotkey >= arr[left]) left++;
            if(left < right) arr[right--] = arr[left];
        }
        arr[left] = pivotkey;
        return left;
    }
}

 

 

posted on 2016-11-03 07:48  程序员修仙之路  阅读(2117)  评论(0编辑  收藏  举报