1. 二分查找
(1)基本思想
二分查找算法的前置条件是,一个已经排序好的序列(在本篇文章中为了说明问题的方便,假设这个序列是升序排列的),这样在查找所要查找的元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止。
(2)自己编写的C++程序:
int Binary_search(int *a,int x,int p,int q)
{
if(a[p+(q-p)/2] == x)
{
return p+(q-p)/2;
}
else if(a[p+(q-p)/2] > x)
{
return Binary_search(a,x,p,p+(q-p)/2-1);
}
else if (a[p+(q-p)/2] < x)
{
return Binary_search(a,x,p+(q-p)/2+1,q);
}
}
2. 顺序统计(中值)
(2)自己编写的C++程序:
#include <iostream>
#include<stdio.h>
using namespace std;
int Partition(int *a,int p,int q)
{
int x = a[p];
int i = p;
int temp;
for(int j = p+1; j<=q; j++)
{
if(a[j]<=x)
{
i++;
//temp = a[i];
//a[i] = a[j];
//a[j] = temp;
swap(a[i],a[j]);
}
}
/*temp = a[p];
a[p] = a[i];
a[i] = temp;*/
swap(a[i],a[p]);
return i;
}
int Rand_Select(int *a,int p,int q,int i)
{
if(p == q)
return a[p];
int r = Partition(a,p,q);
int k = r-p+1;
if(i == k)
return a[r];
else if(i<k)
return Rand_Select(a,p,r-1,i);
else if(i>k)
return Rand_Select(a,r+1,q,i-k);
}
void main()
{
int a[7] = {9,6,4,3,2,2,10};
//Sorting
int n = sizeof(a)/sizeof(int);
for( int i=0;i<n;i++)
cout << a[i] << " ";
cout << endl;
//Searching ith smallest
int i =4;
int key = Rand_Select(a,0,n-1,i);
cout << key << endl;
system("pause");
}