[分治]快速选择算法 C++实现

都有“快速”两个字,实际上快速选择算法跟快速排序算法的思想完全一样:先分区。也就是分治的思想。快速选择算法的目的就是找到数组中的第K大的数

我写的快速排序的算法见这里:http://hi.baidu.com/microgrape/blog/item/30b7f88a0166bd1bc9fc7a43.html

可以对比一下下面的快速选择算法的代码。

#include <iostream>
#include
<vector>

using namespace std;

//search the kth biggest number

int QuickSelect(vector<int> &a, int left, int right, int k)
{
    
int pivot =
a[ left ];

    
int i =
left;
    
int j =
right;
    
while( i <
j )
     {
        
//NOTE: ">=" not ">"

        while ( a[j] >= pivot && i < j )
             j
--
;
         a[i]
=
a[j];

        
while ( a[i] <= pivot && i <
j )
             i
++
;
         a[j]
=
a[i];
     }
     a[i]
=
pivot;

    
//there are i+1 numbers from a[0] to a[i]

    if( k < i + 1 )
        
return QuickSelect( a, left, i - 1
, k);
    
else if( k > i + 1
)
        
return QuickSelect( a, i + 1
, right, k);
    
else

        
return a[i];
}

int main(void
)
{
     vector
<int>
a;
    
//
a[] = {4,2,1,7,10,5,3,2};
    
//the fourth one should be 3.

     a.push_back(4 );
     a.push_back(
2
);
     a.push_back(
1
);
     a.push_back(
7
);
     a.push_back(
10
);
     a.push_back(
5
);
     a.push_back(
3
);
     a.push_back(
2
);

     cout
<<QuickSelect(a, 0, a.size() - 1, 4
);

}

我还是采用了最简单的选择枢纽元(或者叫哨兵)的方法,取第一个元素。

例程中是取了第4大的元素,应该为3。






转载于:https://www.cnblogs.com/microgrape/archive/2011/05/11/2043798.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值