随机快排查找第k小元素和随机化查找第k小元素

随机化查找第k小元素:不必将所有元素按从大到小或从小到大排序即可找出第k小值

思路:随机从序列中取一值,从第一个值开始,将比起小的放在左面,比起大的放在右面。然后比较k与这个值的位置(数组下角标,我设置成从1开始的)如果k的值比这个值的下角标大,那么取这个值的右半部分(都比这个值小)然后再从其中取以随机值,进行如上操作,直到这个值的下角标与k相等为止。如果k的值比这个值的下角标小,那么取这个值的左半部分(都比这个值小)然后再从其中取以随机值,进行如上操作,直到这个值的下角标与k相等为止。

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
unsigned long long a[50000000];
unsigned long long b[50000000];
void suiji(unsigned long long a[],unsigned long long m,unsigned long long r)
{
    if(m<r)
    {
        
        unsigned long long temp=0,p;
        p=rand()%(r-m+1)+m;
        temp=a[m];
        a[m]=a[p];
        a[p]=temp;
        unsigned long long i=m;
        unsigned long long j=r;
        while(i<j)
        {
            while(a[i]<a[j]&&i<j)
            {
                j--;
            }
            if(i<j)
            {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
                i++;
            }
            
            while(a[i]<a[j]&&i<j)
            {
                i++;
            }
            if(i<j)
            {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
                j--;
            }
        
        }
        if(i==j)
        {
            suiji(a,m,i-1);
            suiji(a,i+1,r);
        }
    }
}
void chazhao(unsigned long long a[],int l,int r,int k)
{
    int n=l,m=r,p,i,q=0,v=0;
    p=rand()%(r-l+1)+l;    
    for(i=r;i>=l;i--)
    {
        if(a[i]>a[p])
        {
            b[m]=a[i];
            m--;
        }
        else if(a[i]<a[p])
        {
            b[n]=a[i];
            n++;
        } 
        else
        {
            q++;
        }
    } 
    for(i=n;i<=m;i++)
    {
        b[i]=a[p];
        n++;
    }
    for(i=l;i<=r;i++)
    {
        a[i]=b[i];
    }
    if((k>=(n-q))&&k<n)
    {
        printf("随机化查找第k个数是%d\n",a[k]);
    }
    else if(k<(n-q))
    {
        r=n-q-1;
        chazhao(a,l,r,k); 
    }
    else if(n<=k)
    {
       l=n;
        chazhao(a,l,r,k);
    }
}
int main()
{
    int n,i,k;
    printf("请输入数字个数n<=50000000:");
    scanf("%d",&n);
    printf("请输入k:");
    scanf("%d",&k); 
    srand(time(NULL));
    for(i=1;i<=n;i++){//随机生成待排数组
        a[i]=rand();
    }
    clock_t beg,end;//起始时间和结束时间 
    double time;
    beg=clock();
    suiji(a,1,n);
    printf("随机化快排查找第k个元素是%d\n",a[k]); 
    end=clock();
    time=(double)(end- beg)/CLOCKS_PER_SEC;
    printf("随机产生成数进行随机快排查找第k小元素的运行时间:%f s\n",time);
    beg=clock();
    chazhao(a,1,n,k);
    end=clock();
    time=(double)(end- beg)/CLOCKS_PER_SEC;
    printf("随机产生成数进行随机化查找第k小元素的运行时间:%f s\n",time); 
    return 0;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动化测试中无找到元素的原因可能有以下几种: 1. 元素定位错误:自动化测试使用元素定位方(如ID、XPath、CSS选择器等)来找到页面上的元素。如果定位方错误或不准确,就无找到元素。 2. 页面加载延迟:在元素定位之前,页面可能还没有完全加载完成,导致元素尚未出现在DOM中。在这种情况下,需要添加适当的等待时间,确保元素加载完毕后再进行定位。 3. 动态元素:某些页面可能包含动态生成的元素,这些元素在页面加载过程中会发生变化。在这种情况下,需要使用合适的定位方来确保能够准确找到元素。 4. 元素隐藏或被覆盖:有时候元素可能被隐藏(例如使用CSS的display: none属性)或被其他元素覆盖(例如弹出框)。在这种情况下,需要检查元素的可见性,并确保没有其他元素遮挡了要查找元素。 5. 网络延迟或错误:网络问题可能导致页面加载失败或加载时间过长,从而导致无找到元素。在这种情况下,需要检查网络连接,并确保网络稳定。 6. 页面结构变化:如果页面结构发生变化,例如元素的层级关系或属性发生了改变,之前的定位方可能无找到元素。需要及时更新测试脚本中的定位方。 以上是一些常见的原因,导致自动化测试中无找到元素。在遇到这种情况时,需要仔细排查并分析具体原因,并针对性地解决问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值