利用随机化的思想对快速排序进行优化

        快速排序的基本思想是利用一轮排序让待排记录分为两部分,其中一部分均比另一部分小,然后再分别对两部分采用相同的思想进行排序。假设待排为一数组,首先任意选取一个记录(通常选择第一个记录)作为枢轴,然后按下述原则重新排列记录:将所有关键字较它小的记录都安置在它的位置之前,将所有关键字都较它大的记录都安置在它的位置之后。这个过程即为一轮快速排序。

         就平均时间而言,该算法具有较高效率(O(nlogn))。但当待排序记录的关键字有序或基本有序时,该算法退化为起泡排序,时间复杂度为O(n2)。

         为改进之,引入随机化的思想,及枢轴的位置并非始终为第一个记录,而是随机的选择一个记录作为枢轴。具体代码如下:

import java.util.Random;

public class RQuickSort {
	public RQuickSort() {
		// TODO Auto-generated constructor stub
	}
	
	public void RQSort(int []a, int low, int hight) {
		if(low < hight){
			int pivotkey = Partition(a, low, hight);
			
			RQSort(a, low, pivotkey-1);
			RQSort(a, pivotkey+1, hight);
		}
	}
	
	public int Partition(int [] a , int low, int hight){
		
		//随机的给出枢轴的位置
		Random random = new Random();
		int index = random.nextInt(hight-low+1)+low;

		int temp = a[index];
		a[index] = a[low];
		a[low] = temp;
		
		int pivotkey = a[low];
		
		while(low < hight){
			
			while(low<hight && a[hight] >= pivotkey)
				--hight;
			
			int k = a[hight];
			a[hight] = a[low];
			a[low] = k;
			
			
			while(low<hight && a[low] <= pivotkey)
				++low;
			
			k = a[low];
			a[low] = a[hight];
			a[hight] = k;
		}
		
		
		return low;
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值