QuickSort的JAVA實現
這是一篇算法課程的復習筆記
用JAVA對快排又實現了一遍。
先實現的是那個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();
}
}
}
之后換成使用隨機數獲取排序軸的算法:
修改的部分:
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);
}