JAVA中快速排序演算法的實現
阿新 • • 發佈:2019-02-11
使用快速排序演算法對a[0,n-1]進行排序,從a[0,n-1]中選擇一個元素作為middle,該元素為中點(支點),把剩下的元素分為兩段——left和right;使得left中的元素都小於或等於中點,right中的元素都大於或等於中點。遞迴的使用快速排序演算法分別對left和right進行排序,所得到的結果為left+middle+right,並且,left和right都為有序的序列。
選取最右的元素值,以之為軸,劃分左右範圍,並使得軸左邊小於元素值,軸右邊大於元素值,找到左邊比軸大的 找到右邊比軸小的 交換這兩個值 直到左右下標重合。
排序實現的演算法
package com.QuickSort;
public class QuickSort {
private double[] theArray; //記錄私有屬性
private int nElems; //記錄陣列長度
//建構函式建立陣列
public QuickSort(int max) {
// TODO Auto-generated constructor stub
theArray = new double[max];
nElems = 0;
}
//------------------------------------------
//將元素插入陣列
public void insert( double value){
theArray[nElems]= value;
nElems++;
}
//------------------------------------------
//列印陣列
public void display(){
System.out.print("A=");
for(int j = 0; j<nElems; j++){
System.out.print(theArray[j]+" " );
}
System.out.println();
}
//---------------------------------------------
//執行快速排序方法
public void quicksort(){
recQuickSort(0,nElems - 1);
}
//--------------------------------------------
public void recQuickSort(int left,int right){
if(right - left <= 0){
return; //排序結束
}
else{
double pivot = theArray[right]; //獲取最右元素值
//以最右元素為軸,劃分左右部分
int partition = partitionIt(left, right, pivot);
//對partition元素右邊進行排序
recQuickSort(left, partition-1);
//對partition元素左邊進行排序
recQuickSort(partition+1,right);
}
}
//總體思想是,找到左邊比pivot的元素,最右邊比pivot小的元素,交換這兩個元素
//迴圈進行以上的工作,直至左右下標重疊
private int partitionIt(int left, int right, double pivot) {
// 定義左右下標
int leftPtr = left-1;
int rightPtr = right;
while(true){
//找出比pivot大的左邊的元素
while(theArray[++leftPtr]<pivot)
;
//找出比pivot小的右邊的元素
while(rightPtr>0 && theArray[--rightPtr] > pivot)
;
if(leftPtr >= rightPtr)//左下邊大於右下標結束
break;
else
swap(leftPtr,rightPtr);
}
swap(leftPtr,right);
return leftPtr;
}
private void swap(int dex1, int dex2) {
// 交換元素
double temp = theArray[dex1];
theArray[dex1] = theArray[dex2];
theArray[dex2] = temp;
}
}
排序呼叫的演算法
package com.QuickSort;
public class QuickSortApp {
public static void main(String[] args) {
// TODO Auto-generated method stub
int maxSize = 16;
QuickSort arr = new QuickSort(maxSize);
for( int j = 0; j < maxSize; j++){
double n = (int) (java.lang.Math.random()*99);
arr.insert(n);
}
arr.display();
arr.quicksort();
System.out.println("排序後");
arr.display();
}
}