划分_快速排序的前提技术
生活随笔
收集整理的這篇文章主要介紹了
划分_快速排序的前提技术
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
以定義的某個(gè)值為劃分點(diǎn),將小于它的都放在一邊,大于它的放在另一邊,并不是排序。
在劃分的過程中有兩個(gè)標(biāo)記,他們分別從左邊,右邊開始尋找高于劃分點(diǎn)的值,低于劃分點(diǎn)的值。
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的原因是經(jīng)過循環(huán)之后他們的值會(huì)發(fā)生改變++leftPtr,--rightPtr,swap()就是改變之后的值
//如果swap(0,10),本來的意圖,在錯(cuò)誤的情況下,最終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();
}
}
}
總結(jié)
以上是生活随笔為你收集整理的划分_快速排序的前提技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用CSS完美实现垂直居中的方法
- 下一篇: RDP服务开启