1、什么是划分?
划分数据就是把数据分为两组,把所有大于特定值的数据项放在一组,把小于特定值的数据项放在另一组,划分是快速排序的根本机制。
2、划分算法的效率
划分算法的运行时间为O(N)、
3、示例代码
package com.example.yinrongwu.datastructures.sort.divide;
import android.util.Log;
/**
* @Description :
* @Created Time : YinRong.Wu on 2018/6/22.
* @Author:
* @VerSion :
*/
public class ArrayPar {
private long[] theArray;
private int nElems;
public ArrayPar(int max) {
this.theArray = new long[max];
nElems = 0;
}
public ArrayPar(long[] data) {
this.theArray = data;
nElems = theArray.length;
}
public void insert(long value) {
theArray[nElems] = value;
nElems++;
}
public int size() {
return nElems;
}
public void display() {
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < nElems; i++) {
stringBuffer.append(theArray[i] + ",");
}
Log.e("TestLog", "{" + stringBuffer.toString() + "}");
Log.e("TestLog", "_________________________________________");
}
/**
* @param left 传递0 也就是数组的开始索引
* @param right 数组的长度作为右边开始位置
* @param pivot 特定值
* @return
*/
public int partitionIt(int left, int right, long pivot) {
int leftPtr = left-1;
int rightPtr = right;
while (true) {
while (leftPtr < right && theArray[++leftPtr] < pivot) {
Log.e("TestLog", "leftPtr:" + leftPtr);
// ++leftPtr;
}
Log.e("TestLog", "=====================leftPtr====================" + leftPtr);
while (rightPtr > left && theArray[--rightPtr] > pivot) {
Log.e("TestLog", "rightPtr:" + rightPtr);
}
Log.e("TestLog", "=====================rightPtr====================" + rightPtr);
if (leftPtr >= rightPtr)
break;
else
swap(leftPtr, rightPtr);
}
return leftPtr;
}
/**
* 数据交换
*
* @param leftPtr
* @param rightPtr
*/
private void swap(int leftPtr, int rightPtr) {
long temp;
temp = theArray[leftPtr];
theArray[leftPtr] = theArray[rightPtr];
theArray[rightPtr] = temp;
}
}