快速排序算法
每一次循环都会把数据分割成两部分,以某个数为分界线,分为大于它的和小于它的两部分,然后每一个小部分再次选择某个数进入循环进行计算
如[4,2,6,3,2,8,5,3,2,4,1]
第一次循环以4为分割的点,分为了两个数组[4,2,3,2,3,2,4,1]和[6,8,5]两个部分,这就完成第一次循环了,之后再分别在两个部分里再次选择某个数循环
这个算法的时间复杂度取决于递归树的深度,在最好情况下时间复杂度为nlog2n,最坏是却达到了n^2/2。
这个算法如果为递归实现,那么对应的空间复杂度最好是为log2n,最坏时需要n
总体上来说,快速排序算法算是比较高效的算法,被广泛的应用于各个领域,简单而又实用的算法
递归实现
public class test{
//目标数组
int[] num={32,21,18,65,98,77,21,43,32,59};
//交换函数
public void exchange(int i,int j){
int temp=num[i];
num[i]=num[j];
num[j]=temp;
}
//递归函数
public void quicksort(int i,int j){
int temp=num[i];
int left=i;
int right =j;
if (left>=right)
return;
while (i<j){
while (i<j && num[j]>temp)
j--;
//此时退出来的时候当前j指向的数为小于temp的数,要放在前面部分
while (i<j &&num[i]<=temp)
i++;
//同理,此时退出来的数为大于temp的数
if (i<j)
exchange(i,j);
}
num[i]=temp;//这句可以去掉
quicksort(left,i-1);
quicksort(i+1,right);
}
public static void main(String[] args){
quicksort(1,num.length());
}
}
非递归实现的话需要利用栈来缓存信息,具体实现方法可以看大神的文章 快速排序(三种算法实现和非递归实现)
有什么问题或者想交流的非常欢迎2018-12-19