java中快速排序的优化

接上节讲的快速排序,我们来了解一下几种它的优化。

1.随机取基准

    上节我们采取的是以开头为基准,然后进行一次快速排序,但是如果原数组相对有

序的话,那么就会出现每次找基准,原数组顺序不变,时间复杂度相当的高,为了处

理这种情况我们采用随机选取基准,就是

 public static void new_Quick(int[] array,int low,int high){  
        swap(array,low,rand.nextInt(high-low+1)+low);  //因为不知道起始位置,所以后面加上low
        int par = partion(array,low,high);  
        if(par > low+1){  
            Quick(array,low,par);  
        }  
        if(par < high-1){  
            Quick(array,par+1,high);  
        }  
    }   
    public static void swap(int[] array,int start,int end){  
        int tmp = array[start];  
        array[start] = array[end];  
        array[end] = tmp;  
    }  

2.当前数组中的值过少可以采取直接快速排序法

    这种方法我们就不多做介绍了,我们可以自己确定一个数,比如十,少于十的时

候,直接调用快速排序的方法。

3.聚集相同元素法

    经常会出现一个数组中有很多个相同的元素,为了方便和加速递归,相同的元素我

们可以不用再次递归,直接放在基准的左右位置。

 

以如图为例,我们发现第一次的基准12,有很多相同的元素,那我们遍历的时候可以

将12放在他的周围,然后从除12的数字遍历


然后就是代码实现:

public static int [] fun(int []array,int right,int left,int start,int end,int par){
		int parRight = par-1;
		int parleft = par+1;
		int tmp = 0;
		for(int i = parleft;i>=start;i--){
			if(array[par] == array[i]){
				if(i != parleft){
					tmp = array[parleft];
					array[parleft] = array[i];
					array[i] = tmp;
					parleft--;
				}
			}else{
				parleft--;
			}
		}
		left = parleft;
		for(int j = parRight;j<=end;j++){
			if(array[par] == array[j]){
				if(j != parleft){
					tmp = array[parRight];
					array[parRight] = array[j];
					array[j] = tmp;
					parRight++;
				}
			}else{
				parRight++;
			}
		}
		right = parRight;
		int a[] = {left,right};
		return a;
	}


如有错误,请多多指教。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值