分治法找第K小的数PTA

分治法————找第K小的数

基本思路:用一个基准数a(本题选用数组的第一个元素作为基准数)将S分割为两部分,分别为小于等于a的S1和大于a的S2.记|S1|表示S1中元素的个数,|S2|表示S2中元素的个数。这样当|S1|>k时,那么第k小的数在S1中并且时S1中第k小的数;相反的,当|S1|<k时,那么第k小的数在S2中并且时S2中第k-S1小的数;而当S1=k时,那么这个第k小的数就是基准数本身。

#include <stdio.h>
 #define MAXN 10000
 
 void swap(int *x,int *y)
 {
  int temp;
  temp = *x;
  *x = *y;
  *y = temp;
 }
int partition(int a[],int left,int right)
{
 int e = a[left];
 int L=left,R=right;
 int temp=0;
 
 while(1){
  while(left<=right && e>=a[left]){/*从左向右遍历直到找到比基准数大的数停止*/ 
   left ++; 
  }
  while(left<right && e<a[right]){/*从右向左遍历直到找到比基准数小的数停止*/ 
   right --;
  }
  if(left < right){
   swap(&a[left],&a[right]);/*将左边比基准数大的数与右边比基准数小的数互换,使得左边全是比基准数小的数,右边全是比基准数大的数*/ 
     }
  else
   break;/*当left=right时,此时来到了边界,跳出循环*/ 
 }
 swap(&a[L],&a[left-1]);/*因为a[left-1]比基准数小所以应该将他换到基准数左边,二基准数时S1中最大数*/ 
 
 return left;/*此处的left等价于|S1|*/
 
}
int find(int a[],int left,int right,int k)
{
 int pos =part
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值