快速排序

public static void swap(int data[],int p,int q){
         int temp = data[p];
         data[p] = data[q];
         data[q] = temp;
    }
public static void QuickSort(int data[],int start, int end){
         if(start>=end)  return;
         int i = start;
         int j = end+1;
         //int temp = data[start];
         while(i<j){
            //① i<j是为了确保j和i不超出边界start和end
             while(i<j&&data[--j]>data[start]);  //②j要在前是因为要确保j最后停在小于pivot的位置上
             while(i<j&&data[++i]<data[start]);  //如果i在前面的话,很有可能,i=j的时候j还没有来得及移到小的位置就被i<j的条件拦在外面了
             if(i<j){
                 swap(data,i,j);  
                 //③不可以在这里j--,i++,会导致当二者差2位时候,同时移动到同一位置后,那个位置不确定,导致最后与pivot换位的时候的不确定性
             }else break;         
         }
         swap(data,start,j);
         QuickSort(data,start,j-1);
         QuickSort(data,j+1,end);

    } 

public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a[]={6,1,5,4,7,8,0,7,9,3,2,6,0};
        QuickSort(a,0,a.length-1);
        for(int i = 0; i<a.length; i++){ System.out.print(a[i]+",");}
        
        
    }
void swap(int*p,int*q){
     int temp = *p;
     *p = *q;
     *q = temp;
}
 
void QuickSort(int data[],int start, int end){
         if(start>=end)  return;
         int i = start;
         int j = end+1;
         //int temp = data[start];
         while(i<j){
             while(i<j&&data[--j]>data[start])  ;
             while(i<j&&data[++i]<data[start])  ; 
             if(i<j){
                 swap(data[i],data[j]);            
             }         
         }
         swap(data[start],data[j]);
         QuickSort(data,start,j-1);
         QuickSort(data,j+1,end);

    } 

 

void swap(int*p,int*q){
     int temp = *p;
     *p = *q;
     *q = temp;
}
int  partition(int*d,int start, int end){
     int center = (start+end)/2;
     if(d[start]>d[center])
     swap(d[start],d[center]);
     if(d[start]>d[end])
     swap(d[start],d[end]);
     if(d[center]>d[end])
     swap(d[center],d[end]);
     
     swap(d[center],d[end-1]);
     return d[end-1];
}
//A[start]最小作为j的警戒,pivot放在A[end-1]的地方,作为i的警戒
void QuickSort(int data[],int start, int end){
         if(start>=end)  return;
         int pivot = partition(data,start,end);
         int i = start;
         int j = end-1;
         //int temp = data[start];
         while(i<j){
             while(data[--j]>pivot)  ;
             while(data[++i]<pivot)  ; 
             if(i<j){
                 swap(data[i],data[j]);            
             }         
         }
         swap(data[i],data[end-1]);
         QuickSort(data,start,i-1);
         QuickSort(data,i+1,end);

    }

 

posted @ 2015-07-26 17:31  紫翎255  阅读(181)  评论(0编辑  收藏  举报