划分_快速排序的前提技术
以定义的某个值为划分点,将小于它的都放在一边,大于它的放在另一边,并不是排序。
在划分的过程中有两个标记,他们分别从左边,右边开始寻找高于划分点的值,低于划分点的值。
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(); } }
}