“求一列数中的第二小的数”

来源:互联网 发布:韩国人评论上瘾网络剧 编辑:程序博客网 时间:2024/06/03 17:26

问题:求一列数中的第二小的数

方法:分治法,二分法,每次保留最小的两个数据





#include <stdio.h>
#include <stdlib.h>

#include<iostream>

float a[100];



void two (int i, int j, float &fmin2, float &fmin1)
{
    float lmin2, lmin1, rmin2, rmin1;
    int mid;
   
    if (i==j)
    {
       fmin2=a[i];
       fmin1=a[i];      
    }
    else if (i==j-1)
         if (a[i]<a[j])
            { fmin2=a[j]; fmin1=a[i];}
         else
            { fmin2=a[i]; fmin1=a[j]; }
    else
    {
        mid=(i+j)/2;
        two (i, mid, lmin2, lmin1);
        two (mid+1, j, rmin2, rmin1);
        if (lmin1<rmin1)
           if(lmin2<rmin1)
           { fmin1=lmin1; fmin2=lmin2; }
           else
           { fmin1=lmin1; fmin2=rmin1;}
        else
        {
            if (rmin2<lmin1)
            { fmin1=rmin1; fmin2=rmin2; }
            else
            { fmin1=rmin1; fmin2=lmin1;}   
        }   
    } 
}


float second (int n)
{
 float  min2, min1;
 two(0, n-1, min2, min1);
 return  min2;
}
 

int main( )
{
  int i, n=4;          
  float  min2;
 
  for (i=0;i<n;i++)   
     scanf("%f", &a[i]);
  
  min2=second(n);
  printf("%f\n", min2);
 
 system ("pause");
 return 0;   

}


问题:求一列数中的第 K 小的数

方法:分治法,二分法,每次保留最小的两个数据       

#include <stdio.h>
#include <stdlib.h>
//#include<iostream>
#define n 6


int a[n]={3, 2, 7, 4, 1, 5};
void Swap(int &x, int &y)
{ int t; t=x; x=y; y=t; }

int select(int  a[ ], int left, int right, int k)  //在a [ left : right ]中选择第k小的元素/
{
 int i, j, pivot;
 
 if (left >= right)   return a[left];
 
 i = left;        //从左至右的指针
 j = right+1;       // 从右到左的指针
 pivot = a[left];    //把最左面的元素作为分界数据  
 
 while (1)
 {
  do
  {  // 在左侧寻找>= pivot 的元素
      i = i + 1;
      printf("i= %d a[%d]= %d\n", i, i, a[i]);
  } while (a[i] < pivot && i<5);
 
 do
 {
      j = j - 1;
      printf("j= %d a[%d]= %d\n", j, j, a[j]); 
 } while (a[j] > pivot && j<6); // 在右侧寻找<= pivot 的元素

 
   printf("i= %d, j= %d \n",i, j);
 printf("交换前  i= %d j=%d a[%d]= %d a[%d]= %d\n", i, j, i, a[i], j, a[j]); 
 if (i >= j)   break;         // 未发现交换对象
    Swap(a[i], a[j]);
 printf("交换后   i= %d j=%d a[%d]= %d a[%d]= %d\n", i, j, i, a[i], j, a[j]);
 for (int i=0; i<n; i++)
     printf("a[%d]= %d ", i, a[i]);
     printf("\n\n");
 
 }

 if (j - left + 1 == k)  
     return  pivot;
    
  printf("第二次交换后:\n");
for (int i=0; i<n; i++)
     printf("a[%d]= %d ", i, a[i]);
     printf("\n");  
    
 a[left] = a[j];           // 设置pivot
 a[j] = pivot;


 printf("@@@@@@@  \n");
 for (int i=0; i<n; i++)
     printf("a[%d]= %d ", i, a[i]);
     printf("\n");
 
 if (j - left + 1 < k)     // 对一个段进行递归调用
    return select(a, j+1, right, k-j-1+left);
 else
    return select(a, left, j-1, k);
}
 


int main( )
{
 int k=6,  mink;
 //int a[6]={3, 2, 7, 4, 1, 5};   // 1 2 3 4 5 7;       
 if (k < 1 || k >n)   
     printf("Input error!\n");
 else
 {    mink=select(a, 0, n-1, k);
      printf("第 %d 小的数据是 mink= %d\n", k, mink);
 } 
 
 system ("pause");
 return 0;              
}
   



0 0
原创粉丝点击