随机选择算法

之所以需要随机选择算法,是为了克服一般查找时的从左向右一个个查找的缺点,其思想非常类似于快速排序,还记得快排第一步是干什么吗?就是分割原数组,分割的那个点其实在数组中已经“归位”了,就是摆放在了正确的位置上,分割点左边的元素都是小于它,而右边的都大于它。

随机选择算法就是利用了这一点,每次分割完后,算法就查找分割点是不是要找的那个数,如果是的话,那就直接返回,如果要找的比分割点大的话,那就在分割点右边进行递归的分割操作,反之在左边进行操作。

下面给出源代码:

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

//数组元素的最大个数为MAX个
#define MAX 10

/*分割操作,具体说明在快速排序那一章节里,这里就不赘述了*/
int Partition(int* A,int p,int r)
{
    int x=A[r];
    int i=p-1;
    int j,temp;
    for(j=p;j<r;j++)
    {
        if(A[j]<=x)
        {
            i++;
            temp=A[i];A[i]=A[j];A[j]=temp;
        }
    }
    temp=A[i+1];A[i+1]=A[r];A[r]=temp;
    return i+1;
}

/*参数传入4个值,p为数组首地址,q为数组尾地址,i为要查找的第i小的元素,返回这个元素的值
每次使用分割操作将数组分割成两部分,左边的小于A[q],右边的大于A[q],而此时将i号元素与A[q]比较
若刚好就是要找的那个,那么直接返回
若要找的比q大,那么在q右边递归调用随机选择算法,反之在左边调用*/
int Randomized_Select(int* A,int p,int r,int i)
{
    if(p==r)
        return A[p];
    int q=Partition(A,p,r);
    int k=q-p+1;
    if(i==k)
        return A[q];
    else if(i<k)
        return Randomized_Select(A,p,q-1,i);
    else
        return Randomized_Select(A,q+1,r,i-k);
}

//主函数进行数据测试
int main()
{
    int A[MAX]={3,56,2,34,67,9,5,32,16,94};
    printf("%d\n",Randomized_Select(A,0,9,7));
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值