快速排序思想
1.在待排序的元素任取一个元素作为基准(通常选第一个元素),称为基准元素;
2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;
3.对左右两个分区重复以上步骤直到所有元素都是有序的。
快速排序的稳定性:不稳定
时间复杂度:
数组无序 最好情况 O(nlog2n)
数组有序 最坏情况 O(n^2)
快速排序图解:
上述过程是第一趟的快速排序,接下来,我们只需要对基准左面右边元素重复以上的过程,就排序成功。
递归算法
public static int partion(int []a,int low,int high)
{
int tmp=a[low];
while(high>low){
while(low<high&&a[high]>=tmp){//从右往左找到比tmp小的数
high--;//high向左移动
}
if(low>=high){//如果high--,直到low和high相遇的话,跳出循环
break;
}
else{//如果low<high并且a[high]<tmp
a[low]=a[high];
}
while(low<high&&a[high]<=tmp){//从左向右找比tmp大的数
++low;
}
if(low>=high){//如果low++,直到low和high相遇的话,跳出循环
break;
}else{//low<high&&a[high]>tmp
a[high]=a[low];
}
}
a[low]=tmp;//确定新的基准
return low;//返回基准的下标
}
public static void quick1(int []a,int start,int end){
int par=partion(a, start, end);//先确定第一个基准
if(par>start+1){//如果基准左面有俩个或者俩个以上的元素
quick1(a, start, par-1);//左面进行快速排序
}
if(par<end-1){//如果基准右面有俩个或者俩个以上的元素
quick1(a, par+1, end);//右边进行快速排序
}
}
非递归算法(用栈来实现,所以我们得先定义一个栈的类)
public static int partion(int []a,int low,int high)
{
int tmp=a[low];
while(high>low){
while(low<high&&a[high]>=tmp){//从右往左找到比tmp小的数
high--;//high向左移动
}
if(low>=high){//如果high--,直到low和high相遇的话,跳出循环
break;
}
else{//如果low<high并且a[high]<tmp
a[low]=a[high];
}
while(low<high&&a[high]<=tmp){//从左向右找比tmp大的数
++low;
}
if(low>=high){//如果low++,直到low和high相遇的话,跳出循环
break;
}else{//low<high&&a[high]>tmp
a[high]=a[low];
}
}
a[low]=tmp;//确定新的基准
return low;//返回基准的下标
}
public static void quick(int []array){
stack t1 = new stack();
int low=0;//从数组0号位置开始
int high=array.length-1;//从数组最后一位开始
int par=partion(array, low, array.length-1);//先确定第一个基准
if(par>low+1)//如果基准左面有俩个或者俩个以上的元素
{
t1.push(low);//入栈当前low;
t1.push(par-1);//入栈基准左面的最后一个元素下标
}
if(par<high-1)//如果基准右面有俩个或者俩个以上的元素
{
t1.push(par+1);//入栈基准右面的第一个元素下标
t1.push(high);//入栈当前high
}
while(!t1.isempty())//栈为空时,说明已经排序完
{
high=t1.pop();//确定新的low与high
low=t1.pop();
par= partion(array, low, high);//确定新的基准
if(par>low+1)
{
t1.push(low);
t1.push(par-1);
}
if(par<high-1)
{
t1.push(par+1);
t1.push(high);
}
}
}
调试代码
public static void main(String[] args) {
int []a={12,3,5,6,897,15};
quick1(a, 0, a.length-1);
System.out.println(Arrays.toString(a));
}
//运行结果为
[3, 5, 6, 12, 15, 897]