快速排序 QuickSort java实现 迭代法

算法思路

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)

运行结果

发布了47 篇原创文章 · 获赞 14 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_35097794/article/details/88635196