BFPTR算法

      BFPTR算法的核心思想是:基于快速排序,但是选择的主元上,选一个较优的主元,因此该算法的核心就是选取数组N中的较优的主元。

      BFPRT算法选取主元步骤如下;

1、将数组N分成N/5份,通过简单排序,选取每份中的中位数,并将中位数存放到数组前面。

2、重复BFPRT算法,选取中位数中的中位数。

3、将中位数作为主元,划分数组。


举一个例子来理解这个算法:在一个元素个数为N的数组里,找到升序排在N/5位置的元素的最优算法时间复杂度是(O(n))。

算法实现:

package BFPRT;

public class BFPRT_algorithm {

	public static void swap(int[] a,int high,int low){ //交换数组中两个数的位置
		int temp;
		temp=a[low];
		a[low]=a[high];
		a[high]=temp;
	}
	public static void sort(int[] a,int left,int right){ //简单的冒泡排序
		for(int i=left;i<right;i++){
			for(int j=i;j<right;j++){
				if(a[j]<a[i]){
					swap(a,j,i);
				}
			}
		}
	}
	public static int partition(int[] a,int left,int right,int pivotid){ //根据BFPRT算法选出的中位数作为主元来划分数据
                 //partition()可以用快排来实现
		//划分出以小于主元和大于主元两部分
		swap(a,pivotid,right-1);
		int j=left;
		for(int i=left;i<right;i++){
			if(a[i]<a[right-1]){
				swap(a,i,j);
				j++;
			}
		}
		swap(a,j,right-1);
		return j;
	}
	public static int bfprt(int[] a,int left,int right,int id){  //核心算法,BFPRT算法
			
		if(right-left<=5){  //若数组长度小于等于5,直接输出中位数
			sort(a,left,right);
			return a[id];
		}
		int temp=left;
		for(int start=left,end=start+5;end<right;start+=5,end+=5){  //找出数组中每一份的中位数
			sort(a,start,end);
			swap(a,temp,start+2);
			temp++;
		}
		

		int pivotid=(left+temp)/2;    //选取中位数的中位数
		bfprt(a, left, temp, pivotid);
				
		int m=partition(a,left,right,pivotid);   //以中位数作为主元,划分数据,返回主元所处的位置。
			//判断主元的位置是否和所求位置相等或大于或小于,并分别对此作出相应的处理	
		if(m==id){		
			return a[m];
		}
		else if(m<id){
			return bfprt(a,m,right,id);
		}
		else if(m>id){
			return bfprt(a,left,m,id);
		}
		return -1;
		
	}
	
	public static void main(String[] args){
		int[] a={100,52,554,12,454,843,7,8,6,10,21,25,16,35,9,17,85,86,8256};
		int len=a.length;
		System.out.println("result="+bfprt(a,0,len,(len/5)-1));
		
	}
}

时间复杂度还没算,之后补上。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值