算法_选择问题

//选择问题
//随机选择主元
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stdlib.h>
using namespace std;
const int inf=0x7f7f7f7f;
const int maxn=1000;
int n;
int a[maxn];

int partition(int left,int right)
{//快速排序的一次划分,就可将该主元到达对应位置。
    int i=left,j=right+1;
    do
    {
        do i++;while(a[i]<a[left]);
        do j--;while(a[j]>a[left]);
        if(i<j)
        {
            int tmp=a[i];
            a[i]=a[j];
            a[j]=tmp;
        }
    }while(i<j);
    int tmp=a[left];
    a[left]=a[j];
    a[j]=tmp;
    return j;
}


void select(int &x,int k)
{
    if(n<=0||k>n||k<=0) return;
    int left=0,right=n;
    do{
        int j=rand()%(right-left+1)+left;

        int tmp=a[left];
        a[left]=a[j];
        a[j]=tmp;

        j=partition(left,right);

        //cout<<a[j]<<endl;
        if(k==j+1) {x=a[j];return;}
        else if(k>j+1) left=j+1;
        else  right=j;
    }while(true);

}

int main()
{
    int k;
    while(scanf("%d",&n)!=EOF&&n)
    {
        memset(a,inf,sizeof(a));
        scanf("%d",&k);
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        int ans;
        select(ans,k);
        printf("%d\n",ans);
    }
    return 0;
}

最坏情况的时间复杂度:O(n^2),平均复杂度是线性O(n).

还有二次取中法。大意:将n个数分为k组,对每组找出其中间值放在最前面,然后将每组的中间值 进行比较得到,主元,然后进行划分。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
遗传算法是模拟生物进化过程的一种优化方法。在使用遗传算法解决函数求极值问题时,首先需要定义适应度函数来评估每个个体的优劣程度。在matlab中,可以使用函数句柄来定义适应度函数。 接下来,需要确定遗传算法的参数,包括种群大小、迭代次数、交叉概率、变异概率等。这些参数的选择会影响遗传算法的性能。 然后,需要生成初始种群。可以使用随机数生成初始种群,确保每个个体的取值范围与函数求解范围一致。 接下来,按照设定的迭代次数进行遗传操作。首先进行选择操作,选择操作是通过对适应度函数进行评估,选出适应度较高的个体,这些个体有更大的概率被选中进行交叉和变异操作。接着进行交叉操作,通过对选中的个体进行基因的交换,生成新的个体。最后进行变异操作,以一定的概率对选中的个体进行基因的变异,引入新的基因变化。 迭代过程中,根据适应度函数评估每个个体的优劣程度,可以选择保存适应度最高的个体作为最终的解,也可以保存每次迭代中适应度最高的个体。 最后,通过迭代次数的增加,逐步优化种群中个体的适应度,直到达到设定的迭代次数为止。最终得到的个体即为所求函数的极值。 总的来说,matlab遗传算法通过模拟生物进化过程,逐步优化种群中个体的适应度,解决函数求极值问题。使用合适的适应度函数和参数设定,可以获得较好的优化效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值