题目地址:http://oj.tsinsen.com/A1082

问题描述
  给定一个大小为n的数组s和一个整数K,请找出数组中的第K小元素。

  这是一个补充程序的试题,你需要完成一个函数:

  int findKth(int *s, int n, int K)

  表示在s指向的数组中找到第K小的元素(如果K=1,表示找最小元素),你需要返回该元素的值。

  此题对时间的要求比较高,请注意下面的算法描述。
算法描述
  你可以直接将s中的元素进行排序后输出第K小的元素,但使用这种方法你大概只能得到30%的分数。

  要在一个数组中查找第K小的元素,可以模仿快速排序的做法,即对于数组s[0..n-1],首先用数组中的任意一个元素(可以取第一个)将数组分为三个部分:s[0..p-1], s[p], s[p+1..n-1],其中s[0..p-1]中的值都不大于s[p],s[p+1..n-1]中的值不小于s[p]。

  此时,如果p=K-1,则s[p]是要查找的元素,返回s[p]。

  如果p>=K,则第K小的元素一定在s[0..p-1]中,可以在s[0..p-1]中查找第K小的元素。

  如果p<K-1,则第K小的元素一定在s[p+1..n-1]中,而且是s[p+1..n-1]中的第K-p-1小的元素,你可在这一段中查找第K-p-1大的元素即可。注意由于数组可以看作是静态指针,所以s[p+1..n-1]可以看作是以s+p+1指向的数组,你可以在C++中使用s+p+1来表示这个数组。

这是一道完善程序的试题,你只需要在下面程序标注的"@你的代码"的位置补充适当的语句或语句段使程序能正确运行即可,在提交的时候,你要提交的内容只包括补充的内容,不包括其他的代码。

    int findKth(int *s, int n, int K)
{
@你的代码
}

算法实现:


#include <stdio.h>

int findKth (int * s, int n, int K){
int low = 0;
int high = n - 1;
int pivot = s[0];
while (low < high){
while (low < high && s[high] >= pivot)
--high;
s[low] = s[high];
while (low < high && s[low] <= pivot)
++low;
s[high] = s[low];
}
s[low] = pivot;
if (low == K - 1)
return s[low];
else if (low > K - 1)
return findKth (s, low, K);
else
return findKth (s + low + 1, n - low - 1, K - low - 1);
} int main(void){
int data[10000];
int n;
int k;
int i; scanf ("%d%d", &n, &k);
for (i=0; i<n; ++i)
scanf ("%d", &data[i]);
printf ("%d\n", findKth (data, n, k)); return 0;
}

清橙OJ 1082 查找第K小元素 -- 快速排序的更多相关文章

  1. 基于visual Studio2013解决算法导论之017查找第n小元素

     题目 查找第n小元素 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> ...

  2. 快速排序以及第k小元素的线性选择算法

    简要介绍下快速排序的思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此 ...

  3. 算法导论学习之线性时间求第k小元素+堆思想求前k大元素

    对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...

  4. 如何用快排思想在O(n)内查找第K大元素--极客时间王争《数据结构和算法之美》

    前言 半年前在极客时间订阅了王争的<数据结构和算法之美>,现在决定认真去看看.看到如何用快排思想在O(n)内查找第K大元素这一章节时发现王争对归并和快排的理解非常透彻,讲得也非常好,所以想 ...

  5. 有序矩阵中第k小元素

    有序矩阵中第k小元素 题目: 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素. 看到有序就会想 ...

  6. 中位数与第K小元素

    算法实际上是模仿快速排序算法设计出来的,其基本思想也是对输入数组进行递归划分,与快速排序不同的是,它只对划分出来的子数组之一进行递归处理: int randompartition(int a[],in ...

  7. 寻找第K小元素

    要在一个序列里找出第K小元素,可以用排序算法,然后再找.可以证明,排序算法的上界为O(nlogn). 在这里,给出两种可以在线性时间内找出第K小元素的方法. 方法1: (1) 选定一个比较小的阈值(如 ...

  8. Ex 2_22 两个有序列表合并后的第k小元素..._第四次作业

    package org.xiu68.ch02; public class Ex2_22 { public static void main(String[] args) { // TODO Auto- ...

  9. 查找第K小的元素(利用中位数线性时间选择)(C)

    找任意第k个小的元素 #include <stdio.h> #include <stdlib.h> #include <ctime> #include <io ...

随机推荐

  1. 基于EF创建数据库迁移

    通过创建的实体类和DbContext类利用EF的Code First数据库迁移创建数据库. 下面看代码. 一.先创建实体类 我先添加一个BaseEntity,里面就一个属性 [Key] public ...

  2. Jfinal极速开发微信系列教程(一)--------------Jfinal_weixin demo的使用分析

    概述: Jfinal_weixin已经出了有好一段时间了!一直在关注当中......最近工作上有需要到这个东西,所以,话了两个小时来看看这个东西,看完demo以后,豁然开朗,原理微信和一般的web项目 ...

  3. 【转】CppUnit使用简介

    以下内容来自:http://www.cnblogs.com/wishma/archive/2008/08/01/1258370.html 1. 简介 CppUnit 是个基于 LGPL 的开源项目,最 ...

  4. mac os升级为 Yosemite 10.10 后不能创建javaproject

    出现这样的情况可能是因为mac系统升级导致JAVA的安装路径发生改变(Xcode升级后也出现模拟器位置改变的情况,不要奇怪) 之前安装的eclipse就自然找不到SDK的路径了,所以会捆绑失败 接下来 ...

  5. css3 字体旋转

    <style> #mycon { font-weight: bold; font-size: 150px; transform: rotateX(10deg); -webkit-trans ...

  6. Jordan Lecture Note-2: Maximal Margin Classifier

    Maximal Margin Classifier Logistic Regression 与 SVM 思路的不同点:logistic regression强调所有点尽可能远离中间的那条分割线,而SV ...

  7. Apache的RewriteRule规则详细介绍

    R[=code](force redirect) 强制外部重定向 (rkyW z强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定, ...

  8. codereview介绍

    1. 定义: Code review is systematic examination (often known as peer review) of computer source code. I ...

  9. webbreswer 转成ie11

    http://zhidao.baidu.com/link?url=pvYg-Z5fjOaFHrpdxFSjrDqkaUpvc-tY5VwtLjd7bfmdG4T80i0Rqkkv1zcApZiIq6w ...

  10. hasLayout与Block formatting contexts的学习(下)

    BFC布局规则: 内部的Box会在垂直方向,一个接一个地放置. Box垂直方向的距离由margin决定.属于同一个BFC的两个相邻Box的margin会发生重叠 每个元素的margin box的左边, ...