快速排序思想的应用--求数组中第k小的数

算法思想:

想一想快速排序的思想:将数组中某一个元素m作为划分依据(我们假设为第一个元素,即m = arr[0]),遍历一遍数组,使得数组的格局变成这样的三个部分:(1)m前面的元素 (2)m (3)m后面的元素。其中m前面的元素小于m,m后面的元素大于m,这样找第k小的数正好可以借鉴这个思想,即:

1、若m前面的元素个数大于k,则第k小的数一定在m前面的元素中,这时我们只需要继续在m前面的元素中搜索第k小的数;

2、若m前面的元素个数小于k,则第k小的数一定在m后面的元素中,这是我们只需要继续在m后面的元素中搜索第k-s小的数,其中s是m前面的元素个数。
#include <iostream.h>

#define MAX_SIZE 100

int Biger[MAX_SIZE];
int Smaller[MAX_SIZE];

int Select_kth_Small(int arr[],int n,int k)
{
if(n == 1)
return arr[0];
int b = 0,s = 0,t = arr[0],temp_n,temp_k;
int temp[MAX_SIZE];
for(int i = 1 ; i < n ; i++)//遍历集合
{
if(arr[i] > t)
Biger[b++] = arr[i]; //如果当前元素比t大,就将当前元素加入Biger[]
else
Smaller[s++] = arr[i];//反之就加入到Smaller,这里没有考虑set[0]
}
if(b == 0)
{
Biger[b++] = t;//if...else主要是为了防止t大于或小于其他所有元素的情况
}
else
{
Smaller[s++] = t;
}
//如果Smaller集合中的元素个数大于K,说明第K小的元素必在其中
//否则一定在Biger中,且应该是Biger集合中第k-r小的元素
//更新相应的变量
if(s >= k)
{
temp_n = s;
temp_k = k;
for(i=0;i<temp_n;i++)
{
temp[i] = Smaller[i];
}
}
else
{
temp_n = b;
temp_k = k-s;
for(i=0;i<temp_n;i++)
{
temp[i]=Biger[i];
}
}
return Select_kth_Small(temp,temp_n,temp_k);
}

int main()
{
int arr[]={4,0,1,0,2,3};
int ans = Select_kth_Small(arr,6,3);
cout<<"在数组arr[]={4,0,1,0,2,3}中,第3小的数是:"<<ans<<endl;
return 0;
}

一定要学好数据结构和算法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值