快速排序及代碼實現

The quickSort1.java Program

// quickSort1.java

// demonstrates simple version of quick sort

// to run this program: C>java QuickSort1App

////////////////////////////////////////////////////////////////

class ArrayIns

{

private double[] theArray; // ref to array theArray

private int nElems; // number of data items

//-------------------------------------------------------------

public ArrayIns(int max) // constructor

{

theArray = new double[max]; // create the array

nElems = 0; // no items yet

}

//-------------------------------------------------------------

public void insert(double value) // put element into array

{

theArray[nElems] = value; // insert it

nElems++; // increment size

}

//-------------------------------------------------------------

public void display() // displays array contents

{

System.out.print("A=");

for(int j=0; j<nElems; j++) // for each element,

System.out.print(theArray[j] + " "); // display it

System.out.println("");

}

//-------------------------------------------------------------

public void quickSort()

{

recQuickSort(0, nElems-1);

}

//-------------------------------------------------------------

public void recQuickSort(int left, int right)

{

if(right-left <= 0) // if size <= 1,

return; // already sorted

else // size is 2 or larger

{

/*

這裏是用於比較的數的取值。它必須從要進行排序的序列或其子序列中取值,因爲這樣做才能保證劃分與比較有效。

*/

double pivot = theArray[right]; // rightmost item

// partition range

int partition = partitionIt(left, right, pivot);

recQuickSort(left, partition-1); // sort left side

recQuickSort(partition+1, right); // sort right side

}

} // end recQuickSort()

//-------------------------------------------------------------

public int partitionIt(int left, int right, double pivot)

{

int leftPtr = left-1; // left (after ++)

int rightPtr = right; // right-1 (after --)  *********** not  right + 1

while(true)

{ // find bigger item

/*

這裏無須進行越界判斷,因爲pivot是取自序列 的最右邊。

*/

while(theArray[++leftPtr] < pivot)

; // (nop)

// find smaller item

/*

這裏必須進行越界判斷。

*/

while(rightPtr > leftPtr && theArray[--rightPtr] > pivot)

; // (nop)

if(leftPtr >= rightPtr) // if pointers cross,

break; // partition done

else // not crossed, so

swap(leftPtr, rightPtr); // swap elements

} // end while(true)

swap(leftPtr, right); //****************  put the pivot to  the right place

return leftPtr; // return pivot location

} // end partitionIt()

//-------------------------------------------------------------

public void swap(int dex1, int dex2) // swap two elements

{

double temp = theArray[dex1]; // A into temp

theArray[dex1] = theArray[dex2]; // B into A

theArray[dex2] = temp; // temp into B

} // end swap(

//-------------------------------------------------------------

} // end class ArrayIns

////////////////////////////////////////////////////////////////

class QuickSort1App

{

public static void main(String[] args)

{

int maxSize = 16; // array size

ArrayIns arr;

arr = new ArrayIns(maxSize); // create array

for(int j=0; j<maxSize; j++) // fill array with

{ // random numbers

double n = (int)(java.lang.Math.random()*99);

arr.insert(n);

}

arr.display(); // display items

arr.quickSort(); // quicksort them

arr.display(); // display them again

} // end main()

} // end class QuickSort1App

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章