【洛谷 P1923】 【分治】 求第k小的数

该博客主要讲解如何使用分治策略解决洛谷P1923问题,寻找数组中的第k小元素。解题思路借鉴快速排序的思想,但避免不必要的分区操作。当左区间的右边界大于k时,说明左区间的所有元素都小于第k小的数,因此可以直接排除左区间。
摘要由CSDN通过智能技术生成

【洛谷 P1923】 【分治】 求第k小的数

题目

在这里插入图片描述


解题思路

类似快排的思想
但不需要重复怎么多次
例:找第k小
如果当前左区间的右边界大于k
就可以不在排序左区间了
因为左区间的数都比第k小数小


代码

#include<iostream>
#include<cstdio>
#include<stdlib.h>
using namespace std;
int n,k,a[5000010];
void qsort(int l,int r)
{
    
	 if 
分治法是一种经典的算法策略,它将大问题分解成小问题,然后逐层解决这些小问题,最后合并结果得到原问题的答案。在寻找组中第K大的元素这个问题上,可以采用一种称为“快速选择”(QuickSelect)的变种分治算法。 基本步骤如下: 1. **选择枢轴**:随机选择组的一个元素作为枢轴(pivot)。 2. **分区**:将组分为两部分,一部分包含所有大于枢轴的元素,另一部分包含所有小于或等于枢轴的元素。枢轴位于这两部分之间。 3. **比较**:如果枢轴的位置正好是K-1(假设0-based),那么枢轴就是第K大的元素;否则,根据枢轴的新位置调整目标值K。 4. **递归**:如果K < 枢轴位置,那么在左半部分继续查找第K大的元素;如果K > 构建的右半部分长度,则在右半部分查找。 以下是简单的C语言代码实现(这里假设K是非负整): ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = (low - 1); for (int j = low; j <= high - 1; j++) { if (arr[j] > pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return (i + 1); } void quick_select(int arr[], int low, int high, int k) { if (low == high) { printf("%d is the %dth largest element\n", arr[low], k); return; } int pivot_index = partition(arr, low, high); if (k == pivot_index) return; else if (k < pivot_index) quick_select(arr, low, pivot_index - 1, k); else quick_select(arr, pivot_index + 1, high, k); } int main() { srand(time(0)); int arr[] = {5, 2, 8, 6, 9, 3}; int n = sizeof(arr) / sizeof(arr[0]); int k = 3; quick_select(arr, 0, n - 1, k - 1); // 函索引从0开始,所以k-1表示我们找的是第k大的 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值