题目地址: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. 拼接json示例 json分页并显示所有页码

    <%@ page language="java" import="java.util.*" pageEncoding="gbk"%&g ...

  2. SpringMVC学习 DispatcherServlet (转载)

    3.1.DispatcherServlet作用 DispatcherServlet是前端控制器设计模式的实现,提供spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring Io ...

  3. 【Cocos2d-X开发学习笔记】第09期:渲染框架之菜单类(CCMenu)的使用

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010    一.菜单项(CCMenuItem) 菜单项 ...

  4. cocos2d-x 网格动画深入分析

    转自:http://www.2cto.com/kf/201212/179828.html 在TestCpp中的EffectsTest示例中展示了一些屏幕特效,它是将屏幕划分为多个格子,并对这些格子进行 ...

  5. Java算法试题--猜字母/杀人游戏

    题目例如以下: 把abcd-s共19个字母组成的序列反复拼接106次,得到长度为2014的串. 接下来删除第1个字母(即开头的字母a).以及第3个,第5个等全部奇数位置的字母. 得到的新串再进行删除奇 ...

  6. 在iOS中怎样创建可展开的Table View?(下)

    接上篇:在iOS中怎样创建可展开的Table View?(上) 展开和合拢 我猜这部分可能是你最期望的了,因为本次教程的目标将会在在部分实现.第一次我们设法让顶层的cell,在它们点击的时候展开或者合 ...

  7. android学习日记17--Gallery(画廊视图)

    一.Gallery 1.简述 Gallery有道翻译为画廊,就叫它画廊控件,主要用来可切换的图片展示,左右滑动可以选择上一张或下一张图片. 个人感觉蛮实用的,不过google貌似不推荐使用啊! 2.常 ...

  8. android开发 Fragment嵌套调用常见错误

    在activity中有时须要嵌套调用fragment,但嵌套调用往往带来视图的显示与预期的不一样或是fragment的切换有问题.在使用时要注意几点: 1.fragment中嵌套fragment,子f ...

  9. ME21N/ME22N/ME23N屏幕增强BADI ME_GUI_PO_CUST

    最近想更深入学习下classic BADI, 以前没玩过BADI屏幕增强, 所以决定玩一下. 这次的屏幕增强主要用到两个BADI: ME_GUI_PO_CUST和ME_PROCESS_PO_CUST ...

  10. 火车票硬座座位位置分布图、火车座位分布图 andydao

    夏天要是坐火车硬座在火车上过夜的话,最好带一个小外套,以防睡觉着凉.