java面试题快速排序

什么是快速排序?

原理: 首先找一个基准值,在本次测试中我选取的是左下标。然后派两哨兵分别从左侧和右侧开始检测,左哨兵left向右巡逻,寻找一个比基准值大的元素然后停下,右哨兵向左开始巡逻,寻找一个比基准值小的元素然后停下,最后将两哨兵检测到的元素值进行换位,结束一次循环。(当然前提条件是left<=right)当左右哨兵重合时,把基准值与哨兵所在位置的元素值相交换,结束本轮巡逻!此时,哨兵左边的值都小于原先的基准值,哨兵右边的值都大于基准值,这个时候,将整个数组分成两部分,左半部分和右半部分,分别利用递归思想,完成排序!

翻译成代码就是:

package p2;

import java.util.*;

public class TestArrays{
	public static void main(String []args){
		int []a = {11,10,9,8,7,6,5,4,3,2,1};
		System.out.println("定义的数组为:" + Arrays.toString(a));
		sort(a,0,a.length-1);
		System.out.println("排序后的新数组为:" + Arrays.toString(a));
	}
	
	public static void sort(int []a,int left,int right){
		if(left > right){
			return;
		}
		int i = left,j = right;
		//取left为基准点
		int temp = left;
		while(i < j){
			//右哨兵往左找比基准点小的值
			while(a[j] >= a[temp] && i < j){
				j--;
			}
			//左哨兵往右找比基准点大的值
			while(a[i] <= a[temp] && i < j){
				i++;
			}
			if(i < j){
				swap(a,i,j);
			}
		}
		//将i,j重合点与基准点换位
		swap(a,i,temp);
		//递归调用左数组
		sort(a,left,i-1);
		//递归调用右数组
		sort(a,i+1,right);
	}
	
	//数组元素换位
	public static void swap(int []arr,int i,int j){
		int t = arr[i];
		arr[i] = arr[j];
		arr[j] = t;
	}
}

运行效果如图
在这里插入图片描述
现在让我们看看,本次排序调用了几次sort函数

pulic class TestArrays{
	static int k = 0; //  定义一个计数器k 
	public static void main(String []args){
		//代码和上面的一样
		System.out.println("调用了" + k + "次");
	}

	public static void sort(int []a,int left,int right){
		k++; //每调用一次sort函数  k++
		//代码和上面的一样
	}
}

来看看打印结果
在这里插入图片描述
从这里可以看出,调用了23次,那么怎么来的呢?
首先 main函数调用了一次
然后 排序调用了11次
最后 当left > right 开始依次返回上级调用处
同样的 也返回了11次

可能总结的还不是太到位! 我只是个初学者 慢慢来吧~~~~~~ 嘿嘿~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值