Java排序之快速排序(2)

快速排序

总的来说,是面试最常被问到的算法之一,比如百度,阿里面试就经常会被问到。

快排的平均效率总的来说是最快的排序算法,但是他也有那种最坏的情况。比如说一组数组{9,8,7,6,5,4,3,2,1}然后要排成顺序,那么他的时间复杂度就成了O(n^2)当然这个是最坏情况不会经常遇到,但是我们总要了解下。


好了 然后接下来是我个人对快排的一些简单总结:

在快排(QuickSort)中,我们一般会选出一个中轴(通常情况下我们选择数组的第一位中轴),然后在数组里面进行遍历,把比中轴小的数扔到中轴的前面,比中轴大的数扔到中轴后面,然后根据中轴,我们又分出来两个数组!(中轴以前的数,中轴以后的数,中轴已经排好序了,位置肯定不会变了,可不用管,然后一直递归调用排序,直到每一个数组都为1的长度)


描述也许有点迷糊,那让我们看下Example:


给一组数组sum[]= { 2 ,4 , 9 ,3 ,6 ,7 ,1 ,5}  

我们给数组的中轴定为 第一个 2,定义个low指针指向数组第一个数2,定义一个high 指针指向数组最后一个数5,

2 4 9 3 6 7 1 5  第一步我们从high指向的数字开始,与中轴2比较,5 > 2 满足,不用变,然后high--

2 4 9 3 6 7 1 5  现在high指向1,然后1> 中轴2 不满足,然后把1往前扔,sum[ low ]=sum[ high ]

1 4 9 3 6 7 1 5  然后low+1 开始与中轴数 2比较,4 < 2,不满足,然后得扔到2的后面去  ,所以 sum[high] = sum[low]        这里的low已经是low+1 就是给sum[high] 的位置赋值4

1 4 9 3 6 7 4 5 重复第二步,第三步。比较2和7,2和6,2和3,2和9,全部大于2,满足条件,因此不变  所以次数low==high 指向 数组的第二个数

最后一步,把sum[low] = mid  也就是中轴2 ,这样一次遍历就结束了,比2大的都在2的后面,比2小的都在2的前面。


现在让我们用代码来实现下吧


public class QuicklySort {

	public int getMid(int[] num,int low,int high){
		int temp = num[low];
		while(low < high){
			while(low < high && num[high] > temp){
				high--;
			}
			num[low] = num [high];
			while(low < high && num[low] < temp){
				low ++;
			}
			num[high] = num[low];
		}
		num [low] = temp;
		return low;
	}
	
	public void QuickSort(int[] num,int low,int high){
		if(low < high){
			int mid = getMid(num, low, high);
			QuickSort(num,mid+1,high);
			QuickSort(num,low,mid-1);
		}
	}
	
	public void sort(int[] num){
		if(num.length > 0){
			QuickSort(num,0,num.length-1);
		}
	}
	
	@Test
	public void DoSort(){
		int num[] = {1,3,7,6,4,2,11};
		sort(num);
		for (int i = 0; i < num.length; i++) {
			System.out.println(num[i]);
		}
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值