经典的快速排序和二分查找
#include <stdio.h>
#include 
<stdlib.h>
#include 
<iostream>
using namespace std;

int Partition(int a[],int p,int r)
{
    
int ran=rand()%(r-p+1)+p;       //随即选取卫兵
    swap(a[ran],a[r]);
    
int x=a[r];
    
int i=p-1;
    
for (int j=p;j<r;j++)
    
{
        
if (a[j]<=x)               //小于卫兵的值进行对换
        {
            i
++;
            swap(a[i],a[j]);
        }

    }

    swap(a[i
+1],a[r]);
    
return i+1;
}
   

void QuickSort(int a[],int p,int r)
{
    
int q;
    
if (p<r)
    
{
        q
=Partition(a,p,r);
        QuickSort(a,p,q
-1);
        QuickSort(a,q
+1,r);
    }

}


int BinarySearch(int a[],int min,int max,int x)
{
    
int mid;
    
while (min<max)
    
{
        mid
=min+(max-min)/2;
        
if (a[mid]>=x)
            max
=mid;
        
else
            min
=mid+1;     //若不加一可能存在无限循环的结果
    }

    
if (a[min]==x)
        
return min;
    
else if(a[max]==x)
        
return max;
    
else
        
return -1;
}

void main()
{
    
int num;
    cin
>>num;
    
int* a = new int[num];
    cout
<<"排序前:"<<endl;
    
for(int i=0;i<num;i++)
        cin
>>a[i];
    QuickSort(a,
0,num-1);
    cout
<<"排序后:"<<endl;
    
for (int j=0;j<num;j++)
    
{
        cout
<<a[j]<<endl;
    }

    cout
<<"输入要查找的数"<<endl;
    
int x;
    cin
>>x;
    
int result=BinarySearch(a,0,num-1,x);
    
if (result>=0)
        cout
<<"目标位置为:"<<result+1<<endl;
    
else
        cout
<<"目标不在数组中"<<endl;
}