划分_快速排序的前提技术

以定义的某个值为划分点,将小于它的都放在一边,大于它的放在另一边,并不是排序。
在划分的过程中有两个标记,他们分别从左边,右边开始寻找高于划分点的值,低于划分点的值。

public class ArrayPar {
    private long [] a;
    private int nElems;
    public ArrayPar(int maxSize) {
        a=new long[maxSize];
        nElems=0;
    }
    public void insert(long value) {
        a[nElems]=value;
        nElems++;
    }
    public int size() {
        return nElems;
    }
    public void display() {
        for(int j=0;j<nElems;j++) {
            System.out.print(a[j]+" ");
        }
        System.out.println();
    }
    public int partitionIt(int left,int right,long pivot) {
        int leftPtr=left-1;//为什么要-1
        int rightPtr=right+1;//为什么要+1
        //初始值不是left,right的原因是经过循环之后他们的值会发生改变++leftPtr,--rightPtr,swap()就是改变之后的值
        //如果swap(0,10),本来的意图,在错误的情况下,最终swap(1,9),在正确的初始值情况下就是swap(0,10)
        while(true) {
            //左边找大于特定值的
            while(leftPtr<right && a[++leftPtr]<pivot);
            //右边找小于特定值的
            while(rightPtr>left && a[--rightPtr]>pivot);
            if(leftPtr>=rightPtr)
                break;
            else
                //交换指向的值
                swap(leftPtr, rightPtr);
        }
        return leftPtr;
        
        /*
         * 可以这样写(但是按上面写的思路就更清晰一些)
         * 
         * int leftPtr=left;
          int rightPtr=right;
        while(true) {
            //左边找大于特定值的
            while(leftPtr<right && a[leftPtr++]<pivot);
            //右边找小于特定值的
            while(rightPtr>left && a[rightPtr--]>pivot);
            if(leftPtr>=rightPtr+2)
                break;
            else
                //交换指向的值
                swap(leftPtr-1, rightPtr+1);
        }
        return leftPtr-1;
         * 
         * 
         */
        
    }
    public void swap(int dex1,int dex2) {
        long temp;
        temp=a[dex1];
        a[dex1]=a[dex2];
        a[dex2]=temp;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

}
public class Test {

    public static void main(String[] args) {
        int maxSize=100;
        ArrayPar arrayPar=new ArrayPar(maxSize);
        arrayPar.insert(60);
        arrayPar.insert(30);
        
        arrayPar.insert(80);
        arrayPar.insert(10);
        arrayPar.insert(70);
        arrayPar.insert(90);
        arrayPar.insert(00);
        arrayPar.insert(20);
        arrayPar.insert(40);
        arrayPar.display();
        arrayPar.partitionIt(0, arrayPar.size()-1, 50);
        arrayPar.display();

    }

}

 
























}

 

 

posted @ 2017-12-24 10:20  S-Mustard  阅读(260)  评论(0编辑  收藏  举报