使用快速排序算法对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();
}
}