划分算法

Posted iwebkit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了划分算法相关的知识,希望对你有一定的参考价值。

划分算法的目的

  我们设定一个特定值,让所有数据项大于特定值的在一组,小于特定值的在另一组,划分算法是快速排序的根本机制。

 

划分算法的思想

  在数组的俩头分别有俩个指针,俩个指针相向而行,假定我们让数组头的部分为小于特定值的数据项,数组尾的部分为大于特定值的数据项,当指针相向移动的过程中,头指针遇到大于特定值的数据项并且尾指针也遇到小于特定值的数据项,则这俩个数据项交换位置,直到这俩个指针相遇,这时整个数组分为俩个部分,数组前段为小于特定值的数据项,数组后段为大于特定值的数据项。

 

 

划分算法的java程序

package sy;

class ArrayPar{
    private long[] theArray;
    private int nElems;
    
    public ArrayPar(int max){
        theArray = new long[max];
        nElems = 0;
    }
    
    public void insert(long value){
        theArray[nElems] = value;
        nElems ++;
    }
    
    public int size(){
        return nElems;
    }
    public void display(){
        System.out.print("A = ");
        for(int j = 0; j < nElems; j++)
        {
            System.out.print(theArray[j] + " ");
        }
        System.out.print("");
    }
    
    public int partitionIt(int left,int right,long value)
    {
        //定义左指针,因为内层while的theArray[++leftPtr]先自增了,所以这里先减一
        int leftPtr = left - 1;
        //定义有指针,以为内层while的theArray[++leftPtr]先自减,这里先加一
        int rightPtr = right + 1;
        while(true)
        {
            //内层俩个while循环目的是选择交换项
            while(leftPtr < right && theArray[++leftPtr] < value)
            {
                
            }
            while(rightPtr > left && theArray[--rightPtr] > value)
            {
                
            }
            //如果俩个指针相遇,则停止划分,划分结束
            if(leftPtr >= rightPtr)
            {
                break;
            }
            else
            {
                //交换
                long temp = theArray[leftPtr];
                theArray[leftPtr] = theArray[rightPtr];
                theArray[rightPtr] = temp;
            }
            
        }
        return leftPtr;
    }
}

class App{
    public static void main(String[] args)
    {
        int maxSize = 16;
        ArrayPar arr;
         arr = new ArrayPar(maxSize);
        
        for(int j = 0; j < maxSize; j++)
        {
            long n = (int)(java.lang.Math.random()*199);
            arr.insert(n);
        }
        arr.display();
        long pivot = 99;
        System.out.print("Pivot is " +pivot);
        int size = arr.size();
        int partDex = arr.partitionIt(0, size - 1, pivot);
        System.out.println(",Partition is at index" + partDex);
        arr.display();    
    }
}

 

以上是关于划分算法的主要内容,如果未能解决你的问题,请参考以下文章

2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试

如何使用 xcode 将快照划分为多个片段,以便让用户与每个片段进行交互?

Java 求解划分字母区间

763. 划分字母区间

以下代码片段的算法复杂度

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]