算法导论 寻找第i小元素 9.2】的更多相关文章

PS1:如果单纯为做出这道题那么这个代价是O(nlgn),通过排序就可以了. 这里讨论的是O(n)的算法.那么来分析一下这个算法是如何做到O(n)的,算了不分析了,这个推到看起来太麻烦了.其实我想知道的只是结论而已,想感叹的也是partition真是特别好用啊!!!! 代码: #include<iostream> #include<ctime> using namespace std; ; void Swap(int &a, int &b) { int c = a;…
一.问题描写叙述 给定一个整数数列,寻找其按递增排序后的第k个位置上的元素. 二.问题分析 借助类似快排思想实现pation函数.再利用递归思想寻找k位置. 三.算法代码 public static int selectMinK(int [] arr, int low, int high, int k){ int index = pation(arr, low, high); if(index == k){ return arr[index]; } if(index < k){ return s…
 题目 查找第二小元素 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> void PrintArr(int *pnArr, int nLen) { for (int i = 0; i < nLen; i++) { printf("%d ", pnArr[i]); } printf("\n"…
要在一个序列里找出第K小元素,可以用排序算法,然后再找.可以证明,排序算法的上界为O(nlogn). 在这里,给出两种可以在线性时间内找出第K小元素的方法. 方法1: (1) 选定一个比较小的阈值(如44),当序列元素小于阈值时,直接用排序算法来做: (2) 当序列元素大于阈值时,把元素划分为以5个元素为一组,每一组元素自身作排序,然后挑出每一组元素的中间值,再在所有的中间值中,递归调用本算法,挑出中间值,可以认为,此值大约为整个序列的中间值(当序列元素个数不是5的倍数时,最后一组不足5的舍掉,…
第i小的元素       时间复杂度:O(n). 基本思想:和快速排序的思想相似,也是对数组进行递归划分,但是有所差别的是,快速排序会递归处理划分的两边,而随机化的选择算法只选择一边.       具体步骤为:首先,随机选择一个数组元素作为主元,从而将数组分解为两个子数组,并得到主元在元素中的位置q,假设较小子数组元素的个数为k-1:然后比较i与k的大小,来确定下一次递归选择哪一边的子数组(注意i的值的改变情况):最后,当i==k时,就求得了第i小的元素.具体实例见图解: 具体的程序实现如下:…
题外话 最近有些网友来信问我博客怎么不更新了,是不是不刷题了,真是惭愧啊,题还是在刷的,不过刷题的频率没以前高了,看完<算法导论>后感觉网上很多讨论的题目其实在导论中都已经有非常好的算法以及数学证明,只是照搬的话好像意义也不是很大,希望找到些有代表性的题目在更新,另外希望能接着前面的<穷举递归和回溯算法终结篇>一系列如动态规划.贪心算法类的终结篇,在梳理自己知识结构的同时也能够帮助读者们更系统的学习算法思想.好了话不多说,进入正题. 问题描述 给定一个数组A[n], 定义数组的主元…
目录 1.问题的引出-求第i个顺序统计量 2.方法一:以期望线性时间做选择 3.方法二(改进):最坏情况线性时间的选择 4.完整测试代码(c++) 5.参考资料 内容 1.问题的引出-求第i个顺序统计量 什么是顺序统计量?及中位数概念 在一个由元素组成的集合里,第i个顺序统计量(order statistic)是该集合第i小的元素.例如,最小值是第1个顺序统计量(i=1),最大值是第n个顺序统计量(i=n).一个中位数(median)是它所在集合的“中点元素”.当n为奇数时,中位数是唯一的:当n…
 题目 查找第n小元素 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> void PrintArr(int *pnArr, int nLen) { for (int i = 0; i < nLen; i++) { printf("%d ", pnArr[i]); } printf("\n"…
对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思路例如以下: 1.分解:将A[p,r]分解成A[p,q-1]和A[q+1,r]两部分.使得A[p,q-1]都小于A[q],A[q+1,r]都不小于A[q]; 2.求解:假设A[q]恰好是第k小元素直接返回,假设第k小元素落在前半区间就到A[p,q-1]递归查找.否则到A[q+1,r]中递归查找. 3…
简要介绍下快速排序的思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.时间复杂度为O(nlogn) 一.<data structure and algorithm analysis in c>中的实现,测试过,觉得该说明的已经注释  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18…