选择问题(分治策略)

选择问题:

问题描述:
选择问题(分治策略)_第1张图片
思路:首先,要把它看成树的形式,就是快速排序的思想,然后就是下面的代码程序分三大步骤,第一需要解决的是每次的排序的问题,排序的方法是以第一个为基数,然后同时第一个数,从最后一个数进行比较然后就是位置的交换,这里用到了while(true)的形式,
第二需要解决的问题就是子问题,这里需要解决的判断在左子集中搜索还是右子集中搜索,然后就是递归的解决各个子问题;

关于EOF的用法,在https://blog.csdn.net/henu1710252658/article/details/83040281

  //选择问题
 #include 
 
  int a[50];
  
  int select(int left,int right,int k)  //最左边,最右边的数,第k小的数 
  {
    if( left >= right )    return a[left];  //这是指的最后的树的分支为0 
    
    int x = a[left];
    
    int i = left;
    
    int j = right+1;
    
    while( true )
	{
        do{    //表示数从左向右移  
            i++;
         }while(a[i]x);
         
        if( i>=j )   break ;//这里便是结束条件 
        std::swap(a[i],a[j]); //位置交换 
    } 
     
     if( j-left+1 == k )    return x;//刚好找到第K小的元素 
     
     a[left] = a[j];
     
     a[j] = x;
     
     if( j-left+1 < k ) //这里指的是第K小的元素在右子集里找 
         return select(j+1,right,k-j+left-1);
    else
         return select(left,j-1,k); //这里指的是第k个元素在左子集中找 
 }
 
 	int main()
	
	{
     int n;
     
     while( scanf("%d",&n) != EOF )   //注意这种形式 
	 {
         int k;
         
         scanf("%d",&k);
         
        for( int i = 0; i < n; i++ )
        
            scanf("%d",&a[i]);
            
         printf("%d",select(0,n-1,k));
     }
     return 0;
 }

运行截图:
选择问题(分治策略)_第2张图片

你可能感兴趣的:(初阶算法)