快速排序:该算法在数组中选择一个主元将数组一分为二。使得第一部分中的元素都小于或等于主元,第二部分中的元素都大于主元。然后对第一部分递归应用快速排序算法,对第二部分递归的应用快速排序算法。不过快速排序每次划分都将主元放在了恰当的位置,因为主元的选择直接影响了算法的性能。在理想的情况下,应该选择能平均划分两部分的主元。
7.png
这张图是算法的流程,和归并算法有些相似,都是进行了递归操作。每一次都对已经分好的一部分再一次进行重复操作下面看具体的方法:
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))在时间方面可以说差不多是一样的,不过在空间效率方面快速排序更胜一筹,因为归并排序需要不断地新建数组,需要申请更多的资源空间,相比之下快速排序更好。