码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-12-24 12:46:01      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:new   nbsp   bre   技术   style   private   定义   []   r++   

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

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();

    }

}

 
























}

 

 

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

标签:new   nbsp   bre   技术   style   private   定义   []   r++   

原文地址:http://www.cnblogs.com/S-Mustard/p/8097459.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!