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);
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM