找中间数问题。相当于在中间位置上的数的大小,其左边的数都小于等于它,右边的数都大于等于它。
并不用真的排序,很自然想到了快排。快排思想就是将找出一个标志数,小于它的放左边,大于它的放右边。在这一题中,只需循环,令标志数正好位于中间位置,则该数即为中间数。这次很顺利,一遍通过。
#include<iostream>
using namespace std;
int partition(int *r,int low,int high);
void Swap(int *r,int a,int b);
int cows[10001];
int main()
{
int num,mid,pivot,low,high;
int i;
cin>>num;
for(i=1;i<=num;i++)
{
cin>>cows[i];
}
mid=num/2+1;
low=1;
high=num;
pivot=partition(cows,low,high);
while(pivot!=mid)
{
if(pivot>mid)
high=pivot-1;
else
low=pivot+1;
pivot=partition(cows,low,high);
}
cout<<cows[mid];
return 0;
}
int partition(int *r,int low,int high)
{
int pivotkey=r[low];
while(low<high)
{
if(low<high&&r[high]>=pivotkey)
high--;
Swap(r,low,high);
if(low<high&&r[low]<=pivotkey)
low++;
Swap(r,low,high);
}
return low;
}
void Swap(int *r,int a,int b)
{
int temp;
temp=r[b];
r[b]=r[a];
r[a]=temp;
}