Syong : 快速排序

快速排序

What
快速排序(Quick Sort),是一种优秀的排序算法,它的时间复杂度为O(nlog2n),其核心是一种分治思想。通过一个基准,把数组分为大小两个部分,然后这两个部分再通过各自的基准继续分,直到区间只剩1个元素(这里可以优化,不一定是一个)返回。可以通过递归的方法实现,也可以通过栈的方法实现。

How
java代码

//测试类
public class Test {
    public static void main(String []args) {
  	int[] array = {1,9,8,2,7,3,4,6,5};
  	Quick.sort(array,0,8);
  	for ( int i : array ) {
   	    System.out.println(i);
  	}
    }
}
class Quick{
    //快速排序算法:对int[]数组升序排序
    public static void sort(int[] array,int left,int right) {
        if ( right <= left ) return;
	int pivot = left;//设定基准下标
  	int index = left + 1;//基准左右分割点下标
  	for ( int i = left+1 ; i <= right ; i ++ ) {
   	    if ( array[i] < array[pivot] ) {
    	    	//swap
    		swap(array,i,index);
    		//基准左右分割点下标+1
    		index ++;
   	    }
        }
        //swap again;
    	swap(array,pivot,index-1);
    	sort(array,left,index-1);
    	sort(array,index,right);
    	return;
   }
   //交换值
   public static void swap(int[] array,int i,int j) {
  	if ( i != j ) {
   	    array[i] = array[i] + array[j];
   	    array[j] = array[i] - array[j];
   	    array[i] = array[i] - array[j];
  	}
   }
}

leftright参数,是将要排序或操作作的区间;

pivot是基准,可以看到,我给出得代码里面,pivot得取值总是区间的left值;然后通过比较pivot把[left,right]区间分割为[left,index-1][index,right],两个区间,区间[left,index-1]的值总是小于等于array[pivot],区间[index,right]的值总是大于array[pivot]

循环以上步骤,直到所有sort()出栈;

以上代码sort()方法执行了19次,每一次获得不同得array:
在这里插入图片描述

运行sort(),jvm里得栈帧类似:
第一次运行sort(),left=0,right=8,array{1,9,8,2,7,3,4,6,5}
第二次运行sort(),left=0,right=0,array{1,9,8,2,7,3,4,6,5}
第三次运行sort(),left=1,right=8,array{1,9,8,2,7,3,4,6,5}
第四次运行sort(),left=1,right=7,array{1,5,8,2,7,3,4,6,9}
第五次运行sort(),left=1,right=4,array{1,4,2,3,5,8,7,6,9}
第六次运行sort(),left=1,right=3,array{1,3,2,4,5,8,7,6,9}
第七次运行sort(),left=1,right=2,array{1,2,3,4,5,8,7,6,9}
第八次

上面的代码只是简单实现,还可以继续优化,例如
1.基准的制定,可以随机查找等等;
2.返回的判定条件,不一定要只剩一个元素才return;可以剩三个以下元素时进行比较交换值,减少JVM创建栈帧,提高性能;
3.像java的Array.sort()一样,结合别的排序算法;

When & Where
java中的Array.sort()方法涉及了一些快速排序,显然不止快速排序,还有归并排序,

结束语:优秀是一种习惯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值