快速排序中,如何找到第k个长尾词?

2026-04-12 02:381阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计475个文字,预计阅读时间需要2分钟。

快速排序中,如何找到第k个长尾词?

题目:给定一个长度为 $n$ 的整数序列以及一个整数 $k$,请使用快速选择算法求出序列从小到大排序后第 $k$ 个数。

输入格式:第一行包含两个整数 $n$ 和 $k$。第二行包含 $n$ 个整数,表示序列中的元素。

输出格式:输出一个整数,表示从小到大排序后第 $k$ 个数。

题目

给定一个长度为 $n$ 的整数数列,以及一个整数 $k$,请用快速选择算法求出数列从小到大排序后的第 $k$ 个数。

输入格式 第一行包含两个整数 $n$ 和 $k$。

快速排序中,如何找到第k个长尾词?

第二行包含 $n$ 个整数(所有整数均在 $1∼109$ 范围内),表示整数数列。

输出格式 输出一个整数,表示数列的第 $k$ 小数。

数据范围 $1≤n≤100000,1≤k≤n$ 输入样例:

5 3 2 4 1 5 3

输出样例:

3

思路

正常快速排序要排序两个区间, 该题只需考虑需要的结果存在的那个区间即可

代码

#include <iostream> using namespace std; const int N = 100010; int n, m, f[N]; int quick_sort(int l, int r, int k) { if (l >= r) return f[l]; int x = f[l + r >> 1], i = l - 1, j = r + 1; while (i < j) { do i ++ ; while (f[i] < x); do j -- ; while (f[j] > x); if (i < j) swap(f[i], f[j]); } // 注意k>j的情况要减去 j - l + 1, 加1是因为结果是第几个数并非索引 if (k <= (j - l + 1)) quick_sort(l, j, k); else quick_sort(j + 1, r, k - (j - l + 1)); } int main() { scanf("%d %d", &n, &m); for (int i = 0; i < n; i ++ ) scanf("%d", &f[i]); printf("%d", quick_sort(0, n - 1, m)); return 0; }

本文共计475个文字,预计阅读时间需要2分钟。

快速排序中,如何找到第k个长尾词?

题目:给定一个长度为 $n$ 的整数序列以及一个整数 $k$,请使用快速选择算法求出序列从小到大排序后第 $k$ 个数。

输入格式:第一行包含两个整数 $n$ 和 $k$。第二行包含 $n$ 个整数,表示序列中的元素。

输出格式:输出一个整数,表示从小到大排序后第 $k$ 个数。

题目

给定一个长度为 $n$ 的整数数列,以及一个整数 $k$,请用快速选择算法求出数列从小到大排序后的第 $k$ 个数。

输入格式 第一行包含两个整数 $n$ 和 $k$。

快速排序中,如何找到第k个长尾词?

第二行包含 $n$ 个整数(所有整数均在 $1∼109$ 范围内),表示整数数列。

输出格式 输出一个整数,表示数列的第 $k$ 小数。

数据范围 $1≤n≤100000,1≤k≤n$ 输入样例:

5 3 2 4 1 5 3

输出样例:

3

思路

正常快速排序要排序两个区间, 该题只需考虑需要的结果存在的那个区间即可

代码

#include <iostream> using namespace std; const int N = 100010; int n, m, f[N]; int quick_sort(int l, int r, int k) { if (l >= r) return f[l]; int x = f[l + r >> 1], i = l - 1, j = r + 1; while (i < j) { do i ++ ; while (f[i] < x); do j -- ; while (f[j] > x); if (i < j) swap(f[i], f[j]); } // 注意k>j的情况要减去 j - l + 1, 加1是因为结果是第几个数并非索引 if (k <= (j - l + 1)) quick_sort(l, j, k); else quick_sort(j + 1, r, k - (j - l + 1)); } int main() { scanf("%d %d", &n, &m); for (int i = 0; i < n; i ++ ) scanf("%d", &f[i]); printf("%d", quick_sort(0, n - 1, m)); return 0; }