找出数组[1...n]中第k小元素

本文介绍了一种基于快速排序思想的算法,用于在数组中高效查找第k小的元素。通过递归划分数组,该算法能够显著减少查找特定排序位置元素所需的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1 //问题描述: 试编写一个算法,使之能够在数组L[1...n]中找出第k小的元素(即从小到大排序后处于第k个位置的元素)
 2 
 3 #include <stdio.h>
 4 
 5 // 结合快排思想,查找第5小函数
 6 int find_the_minist_k(int sz[], int k, int low, int high)
 7 {
 8     int lowtemp = low, hightemp = high; // 由于下面修改low, high并且下面递归会用到low, high
 9     int pivot = sz[low];
10     while (low < high)
11     {
12         while (low < high && sz[high] >= pivot)
13             high--;
14         sz[low] = sz[high];
15         while (low < high && sz[low] <= pivot)
16             low++;
17         sz[high] = sz[low];
18     }
19     sz[low] = pivot;
20     // 上面即为快排的划分算法
21     if (low == k) // 由于与k相同,直接返回pivot元素
22         return sz[low];
23     else if (low > k) //枢轴值大于k,在前一部分表中递归查找
24         return find_the_minist_k(sz, k, lowtemp, low - 1);
25     else // 枢轴值小于k,在后一部分中递归查找,注意,查找的k应为k减去前一部分表长度
26         return find_the_minist_k(sz, k - low, low + 1, hightemp);
27 }
28 int main()
29 {
30     int a[] = {0, 5, 10, 8, 100, 50, -10, 60};
31     // 查找数组a中第3小的元素,数组长度为8
32     int the_k_number = find_the_minist_k(a, 3, 0, 7);
33     printf("%d\n", the_k_number);
34     return 0;
35 }

 

转载于:https://www.cnblogs.com/sqdtss/p/10739168.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值