【排序算法】快速排序(java实现)

1.基本思想:

它采用了一种分治的策略,通常称为分治法。

分治法思想:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

对于数组A, 随机选择一个元素作为基准数pos,一般为第一个元素或最后一个元素。

将该数组分为两堆A[0,pos_index-1]  和 A[pos_index+1,n],一堆元素全都小于pos ,另一堆元素全都大于pos ,pos_index 为基准素的下标。

按照分治思想,左右两堆分别进行快排递归操作,即QuickSort(A, 0, pos_index -1) 和 QuickSort(A,  pos_index +1 , n)  。

1)一趟排序过程:


2)整个排序过程:


2.算法分析:

平均时间复杂度: O(nlog2n)      最坏(有序情况下):O(n^2)

空间复杂度:   O(logn)     最坏  O(n)

稳定性:                不稳定

3.算法实现:

public static int partition(int[] array,int l, int r){
		int pos = array[l];
		while(l<r){
			//从右往左找出比基准数小的下标r
			while(l < r && array[r] >= pos) r--;
			// 与基准数交换
			array[l] = array[r];  
			//从左往右找出比基准数大的下标l
			while(l < r && array[l] <= pos) l++;
			array[r] = array[l]; 
		}
	        array[l] = pos;
		return l;
		
	}
	public static void QuickSort(int[] array,int l, int r){
		if(l<r){
			//确定基准数在一次遍历后的下标,左右两边递归进行
			int t = partition(array,l,r);
			QuickSort(array,l,t-1);
			QuickSort(array,t+1,r);
		}
		
	}



4.算法优化:

1.只对长度大于k的子序列递归调用快速排序,让原序列基本有序,然后再对整个基本有序序列用插入排序算法排序。
详见  http://blog.csdn.net/naruto_ahu/article/details/8192039 
2. 通过随机选择初始基准数,使得当面对有序序列时,时间复杂度也为O(nlog2n);同时,去掉了没有必要的对基准数值的来回交换,只需要最后的时候放到目标位置上就可以了。
<span style="white-space:pre">	</span>public static int partition1(int[] array,int l, int r){
		int index  = (int) (Math.random() % (r - l+1) + l);
		int pos = array[ (int) (Math.random() % (r - l+1) + l)];
		while(l<r){
			//从右往左找出比基准数小的下标r
			while(l < r && array[r] >= pos) r--;
			// 与基准数交换
			array[index] = array[r]; 
			index = r;
			
			//从左往右找出比基准数大的下标l
			while(l < r && array[l] <= pos) l++;
			array[index] = array[l]; 
			index = l;
		}
		array[l] = pos;  // 将基准数放入最后所求分割位置
		return l;
		
	}
	public static void QuickSort(int[] array,int l, int r){
		if(l<r){
			//确定基准数在一次遍历后的下标,左右两边递归进行
			int t = partition1(array,l,r);
			QuickSort(array,l,t-1);
			QuickSort(array,t+1,r);
		}
		
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值