/*快速排序(不稳定算法)
* 基本思想:选择数组任一数据作为k,依次从前向后 找到第一个比k大的元素,然后与k交换。
* 从后向前找到第一个比k小的元素,然后与k交换,直到遍历一次,k恰好放到正确的位置
* 然后在分别对k左和k右两部分进行快速排序
* 外层是while循环,条件start<end 为一次遍历
* 循环体两个while,一个从左到右找到第一个比k大的元素交换,条件是(start<end&&a[start]<=base)
* 另一个从右到左找到第一个比k小的元素交换
* 一次遍历之后把数组划分成两部分,然后一次递归;
*
* 复杂度:简单来说,复杂度就是对数据的操作次数
* 在最好和平均情况下,数据从中间划分成两部分,一个大小为n的数组需要划分Log2n次,即递归log2n次,
* 一次对n级别个数据进行操作,所以时间复杂度为O(n*log2n)
* 在最坏的情况下,每次都选到数组中的最大或者最小的元素,每次划分成n-1和1两部分,这样就需要递归n-1次,
* 一次对n级别个数据进行操作,所以最坏的时间复杂度为O(n*2)
* 快速排序的空间复杂度可以理解为递归的深度,而递归的实现依靠栈。
* 已经说明平均需要递归log2n次,所以平均空间复杂度为O(nlog2n)
*
*/
public static void quickSort(int []a,int start ,int end)
{
if(start>=end)
return;
else
{
int mid=quick(a,start,end);
quickSort(a,start,mid-1);
quickSort(a,mid+1,end);
}
}
public static int quick(int []a,int start ,int end)
{
int base =a[end];
while(start<end)
{
while(start<end&&a[start]<=base)
start++;
if(start<end)
{
int temp=a[start];
a[start]=a[end];
a[end]=temp;
//end--;
}
while(start<end&&a[end]>=base)
end--;
if(start<end)
{
int temp=a[start];
a[start]=a[end];
a[end]=temp;
//start++;
}
}
return end;
Ps:博文为博主的学习笔记,算法只是按照自己的理解简单分析,初学者建议看详细的图文讲解,如果有错误,欢迎交流指正