这张图是算法的流程,和归并算法有些相似,都是进行了递归操作。每一次都对已经分好的一部分再一次进行重复操作下面看具体的方法:
public static void fast(int[] arry,int first,int last) {
if(last > first) {
int pivotIndex = fastvoid(arry,first,last);
fast(arry,first,pivotIndex-1);//前半部分
fast(arry,pivotIndex+1,last);//后半部分
}
}
public static int fastvoid(int[] arry,int first,int last) {
int privot = arry[first];
int low = first + 1;
int high = last;
while(low < high) {
/**
* 从前向后和从后向前依次和主元比较,当前面的元素比主元大,后面的元素比主元小则这两个元素互换位置
*/
while(low <= high && arry[low] <= privot) {
low++;
}
while(low <= high && arry[high] >= privot) {
high--;
}
if(high > low) {
int temp = arry[high];
arry[high] = arry[low];
arry[low] = temp;
}
}
while(high > first && arry[high] >= privot) {
high--;
}
if(privot > arry[high]) {
arry[first] = arry[high];
arry[high] = privot;
return high;
}else {
return first;
}
}
方法在数组中左侧开始查找第一个大于主元的元素,然后从数组的右侧开始查找第一个小于或等于主元的元素,最后交换这两个元素。在while循环中重复相同的查找和交换操作。直到所有的元素都查找完为止。如果主元被移动,方法返回将子数组分为两部分的主元的新下标,否则返回主元的原始下标。
快速排序和归并排序(有兴趣的可以看一下上一篇介绍归并排序的(https://www.jianshu.com/p/32b1e3b9927a))在时间方面可以说差不多是一样的,不过在空间效率方面快速排序更胜一筹,因为归并排序需要不断地新建数组,需要申请更多的资源空间,相比之下快速排序更好。