算法分析:快速选择

本文介绍了一种基于快速排序原理的快速选择算法,该算法能够高效地找到未排序数组中的第k小元素。对于大规模数据集,采用快速选择提高查找效率;对于小规模数据集,则采用插入排序来优化性能。

使用类似快速排序的方法,找出第k小的元素。

k从0开始的。

使用了快速排序的部分函数 快速排序

    //快速选择
    template<typename Comparable>
    Comparable& quickSelect(vector<Comparable>& a, int left, int right, int k)
    {
        if (left + 10 <= right)//这个子数组大于10,继续使用快速排序
        {
            Comparable pivot = median3(a, left, right);//枢纽值
            int i = left;//i指向左边
            int j = right - 1;//j指向右边,现在i和j都是已经比较过的了,等下是先++和--
            while (true)
            {
                while (a[++i] < pivot) {}//小于枢纽值的元素是一直放在左边,找出一个大的元素
                while (pivot < a[--j]) {}//大于枢纽值的元素是一直放在右边,找出一个小的元素
                if (i < j)
                {
                    swap(a[i], a[j]);//i和j还没有交汇,交换位置
                }
                else
                {
                    break;//这个时候i指向的数是应该比枢纽值大的了
                }
            }
            swap(a[i], a[right - 1]);//将枢纽值放在i的位置
            if (k <= i)
            {
                return quickSelect(a, left, i - 1, k);//k在左边的子序列中
            }
            else if(k > i + 1)
            {
                return quickSelect(a, i + 1, right, k);//k在右边的子序列中
            }
            else
            {
                return a[i];
            }
           
        }
        else
        {
            //使用插入排序,数组大小小于10的时候
            insertionSort(a.begin() + left, a.begin() + right + 1);
            return a[k];//因为排序是在整个数组里面的,所以第k位置就是所要的值
        }
    }
    
    template<typename Comparable>
    Comparable& quickSelect(vector<Comparable>& a, int k)
    {
        return quickSelect(a, 0, a.size() -1, k);
    }


转载于:https://www.cnblogs.com/fablegame/p/6430199.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值