http://blog.csdn.net/bnuside/article/details/6906688
- ackage com.side.quicksort;
- import com.side.tests.Stack;//作者自己定義的棧類
- public class QuickSort {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- QuickSort t=new QuickSort();
- t.test();
- }
- public void test(){
- //int a[]={10,1,4,7,8,6,3,4,4,4,4,4,2,5,9,4,2};
- int a[]={};
- printArray(a);
- //quickSort(a,0,a.length-1);
- //nonRecrutSort(a);
- nonRecrutQuickSort(a);
- printArray(a);
- //partition(a, 0, 5);
- }
- public void quickSort(int[] a,int start,int end){//遞歸快排
- if(start<end){
- quickSort(a,start,partition(a,start,end)-1);
- quickSort(a,partition(a,start,end)+1,end);
- }
- }
- public void nonRecrutSort(int[] a){//非遞歸快排,兩個棧
- //設置兩個棧,一個用於保存
- if(a==null||a.length<0) return;
- Stack<Integer> startStack=new Stack<Integer>();//保存當前劃分的最高位
- Stack<Integer> endStack=new Stack<Integer>();//保存當前劃分的最低位
- int start=0;
- int end=a.length-1;
- int pivotPos;
- startStack.push(start);
- endStack.push(end);
- while(!startStack.isEmpty()){
- start=startStack.pop();
- end=endStack.pop();
- pivotPos=partition(a, start, end);
- if(start<pivotPos-1){
- startStack.push(start);
- endStack.push(pivotPos-1);
- }
- if(end>pivotPos+1){
- startStack.push(pivotPos+1);
- endStack.push(end);
- }
- }
- }
- public void nonRecrutQuickSort(int a[]){
- if(a==null||a.length<=0)return;
- Stack<Integer> index=new Stack<Integer>();
- int start=0;
- int end=a.length-1;
- int pivotPos;
- index.push(start);
- index.push(end);
- while(!index.isEmpty()){
- end=index.pop();
- start=index.pop();
- pivotPos=partition(a,start,end);
- if(start<pivotPos-1){
- index.push(start);
- index.push(pivotPos-1);
- }
- if(end>pivotPos+1){
- index.push(pivotPos+1);
- index.push(end);
- }
- }
- }
- public int partition(int[] a,int start,int end){//分塊方法,在數組a中,對下標從start到end的數列進行劃分
- int pivot=a[start]; //把比pivot(初始的pivot=a[start]小的數移動到pivot的左邊
- while(start<end){ //把比pivot大的數移動到pivot的右邊
- while(start<end&&a[end]>=pivot) end--;
- a[start]=a[end];
- while(start<end&&a[start]<=pivot) start++;
- a[end]=a[start];
- }
- a[start]=pivot;
- return start;//返回劃分後的pivot的位置
- //printArray(a);
- }
- public void printArray(int a[]){//打印數組內容的方法,用於測試
- for(int i=0;i<a.length;i++){
- System.out.print(a[i]+" ");
- }
- System.out.println();
- }
- }