期望为线性时间的选择算法

Partition 和快速排序类似,只不过返回的是pivot的下标,pivot前面的数都小于pivot,后面的数都大于pivot

int Partition(int* arr, int begin, int end)
{

    int pivot_index =MedianOfThree(arr,begin,end);
    int pivot = arr[pivot_index];
    Swap(arr[pivot_index], arr[end]);
    int left = begin - 1;
    int right = end;
    while (left < right)
    {
        do
        {
            left++;
        } while (arr[left] < pivot);
        do
        {
            right--;
        } while (arr[right] > pivot);
        if (left < right)
        {
            Swap(arr[left], arr[right]);
        }
    }
    Swap(arr[left], arr[end]);
    return left;
}
//begin和end 表示查找的范围,index是相对于begin的下标,例如,如果想找第10小的元素,而begin是5,那么index是(10-5)=5。
下面代码中最后一行,当begin的值变了之后,index也要改变。
int Select(int* arr, int begin, int end, int index)
{
    if (begin == end)
    {
        return arr[begin];
    }
    int q = Partition(arr, begin, end);
    int k = q - begin + 1;
    if (k == index)
    {
        return arr[index];
    }
    else if (index<k)
    {
        return Select(arr, begin, q-1, index);
    }
    else
    {
        return Select(arr, q + 1, end, index - k);
    }
}
static const int len = 200;
int main()
{
    int arr[len];
    for (int i = 0; i < len; i++)
    {
        arr[i] = len-i;
    }
    cout << num << endl;
    return 0;
}

下面是运行结果
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值