qingcheng奕  

//使用快排的思想,查找第几小的元素
#include<iostream>
using namespace std;

int arr[10]={5,3,1,6,8,4,9,90,2,10};

int Partition(int m,int p)  //划分集合 arr[m:p-1],返回arr[m]所在位置的下标
{
 int i,j;
 int flag=arr[m];//在这个函数中,不是使用的中间元素作为标志元素 也不是随机生成的 就是默认的使用传进来数组的第一个元素
    i=m;
 j=p-1;
 while(1)
 {
  while(arr[i]<=flag && i<p-1 ) //遇到小于它的 继续往右走
   i++;
  while(arr[j]>=flag && j>=m)
   j--;
  if(i<=j)// 交换
  {
   int temp;
   temp=arr[i];
   arr[i]=arr[j];
   arr[j]=temp;
  }
  else
   break;   
 }
 arr[m]=arr[j];//最后两个指针,相互错开了
 arr[j]=flag;
 //cout<<j<<endl;
 return j; //返回数组下标

}


int Select(int n, int go) //数组长度为n
{
 cout<<"select"<<endl;
 int parret;
 int low=0,high = n;
      
 while(1)
 {
    parret=Partition(low,high);
    if(parret == go - 1)
     return arr[parret];
    if(parret < go -1 )
    {
     low= parret+1;
    }
    else
     high=parret;
 }
}

int main()
{
   
 cout<<"请输入要找第几小的元素"<<endl;
 int goal;
 scanf("%d",&goal);
 int temp=Select(10,goal);
    printf("你要找的元素为:%d \n",temp);
 return 0;
}

为什么总是不对呢????

posted on 2011-04-25 18:45  qingcheng奕  阅读(646)  评论(1编辑  收藏  举报