QuickSort(快排)的JAVA实现

QuickSort的JAVA实现

这是一篇算法课程的复习笔记

用JAVA对快排又实现了一遍。

easy

先实现的是那个easy版的,每次选的排序轴都是数组的最后一个:

package com.algorithms.jiading.www;

import java.io.*;
import java.util.ArrayList;

/*
这是quicksort的java实现:version1,每次选择最后的元素为spilt的中心
 */
public class quickSort {
    public void exchange(ArrayList<Integer> element, int firstIndex, int secondIndex){
        Integer temp = element.get(firstIndex);
        element.set(firstIndex,element.get(secondIndex));
        element.set(secondIndex,temp);
        return;
    }
    public int findCenter(ArrayList<Integer> element,int begin,int end){
        int i=begin-1;
        int endValue=element.get(end);
        for(int j=begin;j<end;j++){
            if(element.get(j)<endValue){
                i++;
                exchange(element,i,j);
            }
        }
        exchange(element,i+1,end);
        return i+1;
    }
    public void myQuicksort(ArrayList<Integer> element,int begin,int end){
        if(end-begin==1){
            if(element.get(end)<element.get(begin))
                exchange(element,begin,end);
        }
        else if(begin<end){
            int center=findCenter(element,begin,end);
            myQuicksort(element,begin,center-1);
            myQuicksort(element,center+1,end);
        }
        return;
    }
    public static void main(String[] args) {
        ArrayList<Integer> element=new ArrayList<Integer>();
        try {
            //在project中,相对路径的根目录是project的根文件夹
            InputStream is=new FileInputStream("src/com/algorithms/jiading/www/number.properties");
            BufferedReader reader=new BufferedReader(new InputStreamReader(is));
            String tempString = reader.readLine();
            String[] split = tempString.split(",");
            for (String toInt:split
                 ) {
                element.add(Integer.parseInt(toInt));
            }
            /*
            main方法里面调用非静态方法时,需要new一个对象,因为静态方法,静态类属于模板,非静态类和方法属于对象。
             */
            quickSort qq=new quickSort();
            qq.myQuicksort(element,0,element.size()-1);
            for (Integer i:element
                 ) {
                System.out.println(i);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

之后换成使用随机数获取排序轴的算法:

advance

修改的部分:

public int findCenterOriginal(ArrayList<Integer> element,int begin,int end){
        int i=begin-1;
        int endValue=element.get(end);
        for(int j=begin;j<end;j++){
            if(element.get(j)<endValue){
                i++;
                exchange(element,i,j);
            }
        }
        exchange(element,i+1,end);
        return i+1;
    }
    public int findCenter(ArrayList<Integer>element,int begin,int end){
        //不用currentTimeMillis的原因是:当多线程调用时,由于CPU速率很快,因此currentTimeMillis很可能相等,使得随机数结果也会相等
        //nanoTime()返回最准确的可用系统计时器的当前值,以毫微秒为单位。此方法只能用于测量已过的时间,与系统或钟表时间的其他任何时间概念无关。
        long seed=System.nanoTime();
        Random rd=new Random(seed);
        int point=(rd.nextInt(end)%(end-begin+1))+begin;
        exchange(element,point,end);
        return findCenterOriginal(element,begin,end);
    }

猜你喜欢

转载自www.cnblogs.com/jiading/p/11743051.html