算法思路
1.快速排序适用于数据量大且乱序程度高的情况,稳定性较差。
2.设置数组a[],两个参数i,j,i指向排序数组头部,j指向排序数组尾。
3. 保持i<j,初始默认i指向的是key,用j指向的数字与i指向的数字比较,找出大小数,交换Key,将数组分割为两段,最后将基准为i或为j相等的数字交换。
4. 递归。
代码实现
import java.util.Arrays;
public class QuickTest {
public static void sort(int[] a){//重载
if(a.length>0){
sort(a,0,a.length-1);
}
}
//static to function hava what effect?
/*
static修饰
1.修饰成员变量,该变量位于静态区
2.修饰成员方法,最大的作用"类名.方法名" ,实际开发很少用,一static修饰后的方法资源共享,在多线程场景不安全。二静态资源常驻内存,很难被回收。
static方法没有this方法,this方法代表当前对象,而static方法不需要对象。
主要在没有创建对象的时候调用方法/变量
扩展:
构造器不是静态方法,为什么呢?this
3. 静态块
4.静态导包 xxx=方法() 7
*/
public static void sort(int[] a,int low,int high){
int i=low;
int j=high;
if(i>j) return;//pt it before k,avoid xiabiaoyuejie??//放在k之前,防止下标越界
int k=a[i];
while(i<j){
while(i<j&&a[j]>k){
j--;//找出小的数
}
while(i<j&&a[i]<=k){
i++;//找出大的数
}
if(i<j){//交换
int swap=a[i];
a[i]=a[j];
a[j]=swap;
}
}
//change k. 交换k?最后将基准为与i或j相等位置的数字交换
k=a[i];
a[i]=a[low];
a[low]=k;
sort(a,low,i-1);//对左边排序,递归算法
sort(a,i+1,high);
}
public static void main(String[] args)
{
int arr[]={1,45,3,7};
System.out.println(Arrays.toString(arr));
sort(arr);
System.out.println(Arrays.toString(arr));
}
}
算法复杂度
O(n^2)