//使用快排的思想,查找第几小的元素
#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;
}
为什么总是不对呢????