`
holoblog
  • 浏览: 1255941 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:19411
文章分类
社区版块
存档分类
最新评论

编程练习——求无序数组第k小的数

 
阅读更多
为同寝的家伙写了一个求一个无序数组中第k小数的程序。思想就是快排的思想。找一个点,然后放到末尾,然后将小于这个数的值放在数组前面,大于这个值的放在数组后面,然后在将这个末尾的数放回。这个末尾数放入的位置i代表已经找到第i小的数。下面你应该明白了吧,放入的位置如果是k,恭喜你找到了第k小的数。
同样找到第k大的数类似的解法,找到前k个最大数也一样。找一个数组的中位数也一样做。求n个数组的中位数也一样的做。求n个数组的前k个大数或小数也类似可以做。
这个程序的算法复杂度是O(n)
另外这个程序是交换了这个数组元素中的顺序的。现在考虑一下如果不交换过去数组中的元素顺序,并且不开辟一个O(n)空间。那么这个算法的平均复杂度是多少?考虑一下,写在评论中。谢谢。
  1. //swaptwonumber
  2. void swap( int &i, int &j)
  3. {
  4. int temp=i;
  5. i=j;
  6. j=temp;
  7. }
  8. //findapositiontopartitionthearray
  9. int partition( int start, int end)
  10. {
  11. return end/2+start/2;
  12. }
  13. //quicksort
  14. int QuickSort( int a[], int start, int end)
  15. {
  16. if (start>end)
  17. {
  18. throw "error" ;
  19. }
  20. if (start==end)
  21. {
  22. return end;
  23. }
  24. int p=partition(start,end);
  25. int i=0;
  26. swap(a[p],a[end]);
  27. int j=end-1;
  28. while (j>=i)
  29. {
  30. while (a[i]<a[end])
  31. {
  32. i++;
  33. }
  34. while (j>=0&&a[j]>a[end])
  35. {
  36. j--;
  37. }
  38. swap(a[i],a[j]);
  39. }
  40. swap(a[i],a[j]);
  41. swap(a[i],a[end]);
  42. return i;
  43. }
  44. //findthek-thsmallernumber
  45. int FindK( int a[], int num, int kth)
  46. {
  47. if (kth>num||kth<=0)
  48. {
  49. throw "error:nosuchk-thnumber" ;
  50. }
  51. int k=kth-1; //becausethearrayindexstartswith0,not1;
  52. int position=-1;
  53. int start=0;
  54. int end=num-1;
  55. while (position!=k)
  56. {
  57. position=QuickSort(a,start,end);
  58. if (position<k)
  59. {
  60. start=position+1;
  61. }
  62. else
  63. {
  64. end=position-1;
  65. }
  66. }
  67. return a[position];
  68. }
注意这k个数可是无序的..如果想有序..再排序一下就可以了.
分享到:
评论

相关推荐

    c语言入门编程之数组操作两数之和.zip

    - 如果和小于目标值,由于数组是无序的,为了增大和,我们将较小的元素下标加1(即i++)。 - 如果和大于目标值,减小和,移动较大元素的下标(即j--)。 3. 如果循环结束都没有找到满足条件的元素,说明数组中不...

    C语言基础的编程练习精选10题(21~30),附带详细题解和解题思路

    在这个主题中,我们关注的是C语言的基础编程练习,这些练习涵盖了算法和数据结构的基本概念,旨在帮助初学者巩固基础知识。 首先,我们来看编程基础练习1021——迭代法求平方根。在这一练习中,我们需要实现一个...

    数据结构(C语言版)(第2版) —— 严蔚敏 李冬梅 吴伟民.zip

    《数据结构(C语言版)(第2版)》是由严蔚敏、李冬梅、吴伟民三位专家编著的经典教材,对于学习C语言和深入理解数据结构的初学者...结合实际项目或编程练习,将使你更好地掌握这些概念,为未来的软件开发打下坚实基础。

    考研——数据结构考研复习题

    10. **面向对象编程与数据结构**:面向对象编程(OOP)中,数据结构可以作为类的属性,方法可以作为操作数据结构的操作,封装、继承和多态性是OOP的三大特性。 在考研复习中,不仅要理解这些概念,还要能够实际操作...

    数据结构与算法分析Java3rd英文_数据结构与算法分析_

    13. **k-d树**:k维空间的数据结构,用于多维数据的快速查找和最近邻搜索,常用于地理信息系统和机器学习。 14. **配对堆**:一种高效的优先队列实现,提供快速的合并和删除操作。 了解并精通这些数据结构和算法是...

    数据结构与算法分析:C++语言描述(第2版) 奈霍夫 英文版

    "Prentice.ADTs.Data.Structures.and.Problem.Solving.with.Cplusplus.2nd.Edition.0131409093.pdf"可能是书中的一个补充资料或练习题解答,而"数据结构与算法分析——C++语言描述(第2版)Data-Structures-...

    leetcode1两数之和-FE-Algorithms:前端算法学习

    LeetCode是众多开发者喜爱的算法练习平台,其中的第一道题目——"两数之和"(Two Sum),是入门级别的经典问题,旨在帮助我们熟练掌握数组操作与哈希表的应用。本文将深入剖析此题的解题思路,为前端开发者提供一个...

    常见数据结构.zip

    "常见数据结构.zip" 文件可能包含了一系列关于常用数据结构的资源,如ljg_resource1,这可能是某个教程、代码示例或练习题。 1. **数组**:数组是最基本的数据结构,它是一系列相同类型元素的集合,可以通过索引来...

    图论的算法与程序设计

    图论是计算机科学中的一个重要分支,它研究的是网络和关系的数学模型——图。图论的算法与程序设计是将图论理论应用于实际问题解决的关键步骤,涉及到多种数据结构、算法以及编程技巧。在这个主题中,我们将深入探讨...

    JavaScript权威指南 上 中文

    《JavaScript权威指南》是JavaScript编程领域的一本经典之作,它为读者提供了全面而深入的JavaScript语言知识。本书的中文版分为上下两册,本部分主要介绍上册的内容。上册涵盖了JavaScript的基础到进阶概念,旨在...

    数据结构课件.zip

    数据结构是计算机科学中的核心概念,它涉及到如何在计算机中有效地组织和存储数据,以便进行高效的操作。在“数据结构课件.zip”这个...通过实际的编程练习和理论学习,可以进一步提升在算法设计和问题解决上的能力。

    CoreJava笔记

    - **跨平台性**:Java程序能够在不同操作系统上运行,这得益于其编译过程中的独特设计——Java虚拟机(JVM)。Java源代码编译为字节码,由JVM解释执行,这样就避免了直接与底层硬件和操作系统交互所带来的限制。 3. ...

    python jiaocheng

    与大多数其他编程语言中的数组相比,Python的列表具有以下几个显著特点: - 不固定长度,可以随时增加或删除元素。 - 列表中的元素不必是相同类型。 - 元素本身也可以是列表,这意味着列表可以嵌套。 ##### 2.2 ...

    java集合框架之Collection实例解析

    在`Collection`接口下,有两个主要的子接口——`List`和`Set`,它们分别代表有序的元素集合和无序不重复的元素集合。 1. **List接口**:`List`接口继承自`Collection`,它维护了元素的顺序,并允许包含重复元素。`...

    2010计算机考研专业综合

    《2010计算机考研专业综合》主要涵盖了计算机科学与技术领域的核心科目——数据结构。数据结构是计算机科学中至关重要的基础课程,它研究如何在计算机中组织和管理数据,以便于高效地进行存储、检索和处理。对于准备...

    Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例

    本文将详细讨论四种常见的排序算法——插入排序、冒泡排序、快速排序和选择排序,并提供它们在Python中的实现。 1. **插入排序(Insertion Sort)** 插入排序是一种简单直观的排序算法,它的工作原理类似于我们平时...

    tekwill-homework:家庭作业Java

    它可能包含一系列Java编程练习,旨在帮助学习者掌握Java语言的基础知识以及更高级的概念。通过解决这些作业,学生可以提升编程技能,理解类、对象、继承、多态、接口等核心概念。 【Java基础知识】 1. **类与对象*...

    leetcode-summary

    《LeetCode学习总结——Python篇》 LeetCode是全球开发者广泛使用的在线编程挑战平台,它提供了丰富的算法题目,旨在帮助程序员提升技能、准备面试,并在实际工作中应用所学。本资料集“leetcode-summary”主要围绕...

Global site tag (gtag.js) - Google Analytics