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

为同寝的家伙写了一个求一个无序数组中第k小数的程序。思想就是快排的思想。找一个点,然后放到末尾,然后将小于这个数的值放在数组前面,大于这个值的放在数组后面,然后在将这个末尾的数放回。这个末尾数放入的位置i代表已经找到第i小的数。下面你应该明白了吧,放入的位置如果是k,恭喜你找到了第k小的数。
同样找到第k大的数类似的解法,找到前k个最大数也一样。找一个数组的中位数也一样做。求n个数组的中位数也一样的做。求n个数组的前k个大数或小数也类似可以做。
这个程序的算法复杂度是O(n)
另外这个程序是交换了这个数组元素中的顺序的。现在考虑一下如果不交换过去数组中的元素顺序,并且不开辟一个O(n)空间。那么这个算法的平均复杂度是多少?考虑一下,写在评论中。谢谢。
  1. // swap two number
  2. void  swap( int  &i,  int  &j)
  3. {
  4.      int  temp = i;
  5.     i = j;
  6.     j = temp;
  7. }
  8. // find a position to partition the array
  9. int  partition( int  start,  int  end)
  10. {
  11.      return  end/2+start/2;
  12. }
  13. // quick sort
  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.     
  27.     swap(a[p],a[end]);
  28.      int  j = end-1;
  29.      while (j>=i)
  30.     {
  31.          while (a[i]<a[end])
  32.         {
  33.             i++;
  34.         }
  35.         
  36.          while (j >= 0 && a[j]>a[end])
  37.         {
  38.             j--;
  39.         }
  40.         swap(a[i],a[j]);
  41.     }
  42.     swap(a[i],a[j]);
  43.     swap(a[i],a[end]);
  44.      return  i;
  45. }
  46. // find the k-th smaller number
  47. int  FindK( int  a[],  int  num, int  kth)
  48. {
  49.      if (kth > num || kth <= 0)
  50.     {
  51.          throw   "error: no such k-th number" ;
  52.     }
  53.      int  k = kth-1; // because the array index starts with 0, not 1;
  54.      int  position= -1;
  55.      int  start = 0;
  56.      int  end = num-1;
  57.      while (position != k)
  58.     {
  59.         position = QuickSort(a,start,end);
  60.         
  61.          if (position < k)
  62.         {   
  63.             start = position+1;
  64.         }
  65.          else
  66.         {
  67.             end = position-1;
  68.         }
  69.     }
  70.      return  a[position];
  71. }
注意这k个数可是无序的..如果想有序..再排序一下就可以了.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值