快速排序总结
在现在的各种排序算法之中,快排应该算是最快的,特别是当基数非常大的时候其特点就能显示出来,但是快排也有其缺点,比如当序列本来就是基本有序的时候那么快排的时间复杂度就会降低。
基本思想:1.首先在一个序列中选取一个基准值,从序列两边的数开始和基准值比较,较小的放在基准值的左边,较大的放在基准值的右边,这样就形成了两个子序列,其中左边的序列都比基准值小,右边的序列都比基准值大,这样再对这两个子序列分别进行上述的操作,以后以此类推,直到子序列的长度为1(其实这就是递归的思想)
代码实现:
这里我用顺序表来进行快速排序的实现,首先我创建了一个顺序表类,类中有对顺序表的一些操作,也包括对底层数组的快排方法。
public class ArrayInt {
private long[] array;
private int len;
// 初始化,构建底层数组
public ArrayInt(int len) {
array = new long[len];
len = 0;
}
// 添加元素
public boolean insert(long value) {
array[len] = value;
len++;
return true;
}
// 输出顺序表
public void display() {
String s = "[";
for (int i = 0; i < len; i++) {
if (i == 0)
s += array[i];
else
s += "," + array[i];
}
s += "]";
System.out.println(s);
}
public void quickSort(){
recquickSort(0,len-1);
}
// 快速排序算法
public void recquickSort(int left, int right) {
if ((right - left) <= 0)
return;
else {
long pivot = array[right];
int pivotposition = searchPivot(left, right, pivot);
recquickSort(left, pivotposition - 1);
recquickSort(pivotposition + 1, right);
}
}
public int searchPivot(int left, int right, long pivot) {
int leftptr=left-1;
int rightptr=right;
while (true) {
//左右都在判断,如果有不符合条件的就立马交换
while (array[++leftptr] < pivot) ;
while (rightptr >0 && array[--rightptr] > pivot) ;
if ( rightptr <= leftptr)
break;
else{
exchange(leftptr, rightptr);
}
}
exchange(leftptr,right);
return leftptr;
}
public void exchange(int l, int m) {
long temp = array[l];
array[l] = array[m];
array[m] = temp;
}
总结:
其实快排的核心在于如何选取这个枢纽,即基准值,我们其实可以任意选取,但是我们在分组之后如何将这个枢纽插入在数组之中呢?这里的手法是每次都将数组的最后一个数据项作为基准值,每次分完组之后就将右边子序列的第一个数据项与这个基准值互换位置,为什么可以这样做呢,因为右子序列都是比基准值大的值而且是无序的,所以这种交换插入方式并没有改变快排的原理,而且这样的一个好处是,下次递归就不用再操作本次的基准值了,这就是快排的含义,至于怎么实现这只是其中一种方法,其他方法可以根据自己的理解加以改变!