算法导论:求第k小的数

题目描述

给定n(1<=n<=1000000)个元素,求第k小数(1<=k<=n)。

输入

一组样例。第一行输入两个整数n和k。第二行输入n个不同的int范围内的数。

输出

输出一行,输出第k小数。

样例输入

5 2
1 5 3 2 4

样例输出

2

#include <iostream>
using namespace std;
void Qsort(int arr[], int low, int high, int k){
    int i = low;             //快速排序
    int j = high+1;
    int key = arr[low];
    while (true)
    {
        while (arr[++i] < key){
        	if (i == high)
            	break;
        }
        while (arr[--j] > key){
        	if (j == low)
                break;
        }
        if (i >= j) break;
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    int temp = arr[low];
    arr[low] = arr[j];
    arr[j] = temp;
    if(j==(k-1)){      //j是当前基准元素的下标 它等于k的下标 即找到第k小的数了
    	cout<< arr[k-1]<<endl;
    	return ;
	}
    if(j<(k-1)){     //j小于k下标 说明k会出现在右子列 只对右子列进行操作
    	Qsort(arr, j + 1, high,k);
		}
    else{           //j大于k下标 说明k会出现在左子列 只对左子列进行操作
    	Qsort(arr, low, j - 1,k);
		}
}
int main(){
	int n,k;
	cin >> n >> k;
	int nums[n];
	for(int i=0;i<n;i++)
		cin >> nums[i];
	Qsort(nums, 0, n-1,k);
	return 0;
}

学校的OJ上这题单纯用快排把数组排好再求第k个数也能AC 但是上课老师讲到分治讲到这个问题的时候用的方法是每次只看一个子列不管另一个k不会出现的子列 想试着写出来 写了一天终于写出来了 菜鸡哭泣
最大的问题就是一直在k应该是相对下标还是绝对下标那里搞不清楚 上课的时候老师特别强调k是相对low的 我就一直往相对下标的方向设参数 但是输出不对 仔细看看了想了想发现不一定要相对下标 这里一直是在原数组上操作没改变数组大小 用绝对下标就行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值