二分法

OK,又到了讲排序的时候了,今天主要学习了一下二分查找和排序,其实二分法的本质就是分区间,比如对于一个已经排序好的数列或者文件中找一个字,那么本来可以一个个从头到尾找下去,但是我们可以把他分成两部分,和中间值比较,如果小于中间值呢,就到前半部分,大于呢,就在后半部分找,最后的目的就是只有两个值能和要找的数据比较,下面贴算法:

void fn_erfen(int *p,int count,int val)
{int beigin=0,end=count-1,mid=0
while(begin<end-1)
{mid =begin+(end-begin)/2;
if(p[mid]>val)
end=mid;
else
begin=mid;
}
if(p[begin]==mid)
cout<<begin<<endl;
else
if(p[end]==mid)
cout<<end<<endl;
else
cout<<"木有啊"<<end;

}
//再加上一种很容易弄错的方法,虽然比较容易理解,但是会进入死循环

void fn_erfen(int *p,int count,int val)
{int begin=0,end=count-1,mid=0;
while(begin<=end)
{mid=begin+(end-begin)/2;
if(p[mid]<val)
begin=mid+1;
else
if(p[mid]>val)
end=mid-1;
else
if(p[mid]==val)
cout<<Mid<<endl;

}
}


OK,这个只是查找,下面是快速排序咯,先上代码:

#include <iostream.h> 
void run(int* pData,int left,int right)
{
int i,j;
int middle,iTemp;
i = left;
j = right;
middle = pData[(left+right)/2]; //求中间值
do{
 while((pData<middle) && (i<right))//从左扫描大于中值的数
  i++;  
 while((pData[j]>middle) && (j>left))//从右扫描大于中值的数
  j--;
 if(i<=j)//找到了一对值
 {
  //交换
  iTemp = pData;
  pData = pData[j];
  pData[j] = iTemp;
  i++;
  j--;
 }
}while(i<=j);//如果两边扫描的下标交错,就停止(完成一次)
//当左边部分有值(left<j),递归左半边
if(left<j)
 run(pData,left,j);
//当右边部分有值(right>i),递归右半边
if(right>i)
 run(pData,i,right);
}
void QuickSort(int* pData,int Count)
{
run(pData,0,Count-1);
}
void main()
{
int data[] = {10987654};
QuickSort(data,7);
for (int i=0;i<7;i++)
 cout<<data<<" ";
cout<<"\n";
}


明天看C++对XML操作。

posted @ 2012-02-13 23:56  RINA  阅读(437)  评论(0编辑  收藏  举报