importjava.util.ArrayList;importjava.util.Arrays;importjava.util.Stack;publicclassQSort {/***@authorWangYu 2008-05-29 初始
*@parampData
* 需要排序的数组
*@paramleft
* 左边的位置,初始值为0
*@paramlength
* 右边的位置,初始值为数组长度*/publicstaticvoidquickSort(int[] pData,intleft,intright) {inti, j;intmiddle, temp;
i=left;
j=right;
middle=pData[left];while(true) {while((++i)
;while((--j)>left&&pData[j]>middle)
;if(i>=j)break;
temp=pData[i];
pData[i]=pData[j];
pData[j]=temp;
}
pData[left]=pData[j];
pData[j]=middle;
System.out.print("分界值:"+middle+"下标"+j+":");for(intk=0; k
System.out.print(pData[k]+"");
}
System.out.println();if(left
quickSort(pData, left, j);if(right>i)
quickSort(pData, i, right);
}/***@authorardorleo 2010-11-21 快速排序优化后的递归实现
*@parampData
* 需要排序的数组
*@paramleft
* 左边的位置,初始值为0
*@paramlength
* 右边的位置,初始值为数组长度*/publicstaticvoidqSort1(int[] pData,intleft,intlength) {inti, j;intmiddle, temp;
i=left;
j=length;
middle=pData[left];while(true) {//在循环体中,middle只用做比较,但值保持不变while((++i)
;while((--j)>left&&pData[j]>middle)
;if(i>=j)break;
temp=pData[i];
pData[i]=pData[j];
pData[j]=temp;
}//较小的值在左,较大的值右pData[left]=pData[j];
pData[j]=middle;
System.out.print("分界值:"+middle+"下标"+j+":");for(intk=0; k
System.out.print(pData[k]+"");
}
System.out.println();//此种条件可以避免多余排序(每一趟最后两个相邻已比较后,就不用再递归了)if(j-left>1)
qSort1(pData, left, j);if(length-i>1)
qSort1(pData, i, length);
}/***@authorardorleo 2010-11-21 快速排序的非递归实现
*@parampData
* 需要排序的数组
*@paramleft
* 左边的位置,初始值为0
*@paramlength
* 右边的位置,初始值为数组长度*/publicstaticvoidqsort2(int[] pData,intorignal_start,intorignal_length) {inttemp;intstart=orignal_start;intlength=orignal_length;intleft=orignal_start;intright=orignal_length;intreference=pData[left];
StackintStack=newStack();while(true) {while(true) {while((++left)
;while((--right)>start&&pData[right]>reference)
;if(left>=right)break;
temp=pData[left];
pData[left]=pData[right];
pData[right]=temp;
}
pData[start]=pData[right];
pData[right]=reference;
System.out.print("分界值:"+reference+"下标:"+right+"当前顺序:");for(intk=0; k
System.out.print(pData[k]+"");
}
System.out.println();//分值左边排序if(right>start+1) {
intStack.push(length);
length=right;
left=start;
}//分值右边排序while(length<=left+1&&!intStack.empty()) {inttempLength=intStack.pop();
left=length+1;
length=tempLength;
}if(length>left+1) {
start=left;
right=length;
}//结束条件if(intStack.empty()&&length<=left+1)break;//left值有可能大于下标最大值reference=pData[left];
}
}publicstaticvoidmain(String[] args) {int[] pData=newint[10];for(inti=0; i<10; i++) {
pData[i]=(int) (Math.random()*100);
}
System.out.print("数组原始序列:");for(inti=0; i
System.out.print(pData[i]+"");
System.out.println("\n***********************");
QSort.qsort2(Arrays.copyOf(pData, pData.length),0, pData.length);
System.out.println("***********************");
QSort.qSort1(Arrays.copyOf(pData, pData.length),0, pData.length);
System.out.println("***********************");
QSort.quickSort(Arrays.copyOf(pData, pData.length),0, pData.length);
}
}