c语言第k小元素(减治法),查找第k小的元素-减治法

问题描述:n个数中找出第k小的元素

输入:

9

5 3 8 1 4 6 9 2 7

4

输出:

4

用快排思想先找出数组中第一个元素的位置(博客中有快排算法):

排序前:5 3 8 1 4 6 9 2 7

排序后:2 3 4 1 5 6 9 8 7    (5的位置确定了)

用k与元素5的下标计较,等于就输出,小于递归5前的元素,大于递归5后的元素

代码:

#include

using namespace std;

void QuickSort(int *a,int left,int right,int k)

{

int i=left;

int j=right;

while(i

{

int temp;

//从后往前比较

while(i

j--;

if(i

{

temp=a[i];

a[i]=a[j];

a[j]=temp;

i++;

}

//从前往后比较

while(i

i++;

if(i

{

temp=a[i];

a[i]=a[j];

a[j]=temp;

j--;

}

}

if(k==i)

{

cout<

return;

}

else if(k

{

QuickSort(a,left,i-1,k);

}

else

{

QuickSort(a,j+1,right,k);

}

}

int main()

{

int n;

int k;

int a[100];

cin>>n;

int left=1,right=n;//对应下标位置

for(int i=1; i<=n; i++)

{

cin>>a[i];

}

cin>>k;

QuickSort(a,left,right,k);

return 0;

}

标签:right,治法,int,元素,QuickSort,快排,查找,left

来源: https://www.cnblogs.com/xxaf/p/12958237.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值