zoukankan      html  css  js  c++  java
  • 划分_快速排序的前提技术

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

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
























    }

     

  • 相关阅读:
    Linux下程序对拍_C++
    KMP算法_模板_C++
    [ CodeVS冲杯之路 ] P2952
    Netty入门(七)使用SSL/TLS加密Netty程序
    Netty入门(六)Decoder(解码器)
    Netty入门(五)ChanneHandler
    Netty入门(四)ByteBuf 字节级别的操作
    Netty入门(三)构成部分
    Netty入门(二)时间服务器及客户端
    Netty入门(一)环境搭建及使用
  • 原文地址:https://www.cnblogs.com/S-Mustard/p/8097459.html
Copyright © 2011-2022 走看看