二分法查找算法:
#include<iostream>
using namespace std;
int binarysearch(int * a,int n,int num);
int main()
{
inta[5]={9,8,5,7,3};
for(inti=0;i<5;i++)
for(intj=i+1;j<5;j++)
if(a[i]>a[j])
swap(a[i],a[j]); //排序
for(i=0;i<5;i++)
cout<<a[i]<<",";
cout<<endl;
int e=binarysearch(a,5,3); //二分查找
cout<<"二分法查找:"<<a[e-1]<<endl;;
return0;
}
int binarysearch(int * a,int n,int num)
{
if(n<=0) //如果n小于零,则函数结束
returnNULL;
else
{
intmid=n/2; //取数组中间的元素,mid作为数组下标进行元素的比较,如果相等,则第mid+1个元素为要查找的元素
if(a[mid]==num)
returnmid+1;
else
{
if(num<a[mid]) //如果num小于下标为mid的元素,则从该元素的左边进行二分法查找,右边忽略
return binarysearch(a,mid,num);
else
return binarysearch(a+mid,n-(mid+1),num); //如果num大于下标为mid的元素,则从该元素的右边进行二分法查找,左边忽略
}
}
}
合并排序算法—递归
#include<iostream>
using namespace std;
template<class T>
void Merge(T c[],T d[],int l,int m,int r)
{
//合并c[l:m]和c[m+1:r]到d[l:r]
inti=l,j=m+1,k=l;
while((i<=m)&&(j<=r)) //如果i小于m并且j小于数组的边界,则由i位置数据与j位置数据比较,较小的放到b的相应位置
if(c[i]<=c[j])
d[k++]=c[i++];
else
d[k++]=c[j++];
if(i>m)
for(intq=j;q<=r;q++)
d[k++]=c[q];
else
for(intq=i;q<=m;q++)
d[k++]=c[q];
}
template<class T>
void Copy(T a[],T b[],int left,int right)
{
for(inti=left;i<=right;i++)
a[i]=b[i];
}
template<class T>
void MergeSort(T a[],int left,int right)
{
if(left<right) //至少有2个元素
{
inti=(left+right)/2; //取中点
Tb[100];
MergeSort(a,left,i);
MergeSort(a,i+1,right);
Merge(a,b,left,i,right); //合并到数组b
Copy(a,b,left,right); //复制回数组a
}
}
int main()
{
inta[8]={4,8,3,7,1,5,6,2};
MergeSort(a,0,7);
for(inti=0;i<8;i++)
cout<<a[i]<<",";
cout<<endl;
return0;
}
冒泡排序:
#include<iostream>
using namespace std;
template<class T>
void Sort(T a[],int n) //冒泡排序
{
bool changed=false; //设置bool变量记录是否发生交换,当上一轮发生交换则进行下一轮排序
//当不发生交换时,则不用进行下一轮排序,冒泡排序结束
do
{
changed=false;
for(int i=1;i<n;i++)
if(a[i-1]>a[i]) //判断相邻的两个元素的大小,小的放在前面
{
swap(a[i-1],a[i]);
changed=true;
}
} while (changed);
}
int main()
{
int a[8]={4,3,7,1,5,6,8,2};
Sort(a,8);
for(int i=0;i<8;i++)
cout<<a[i]<<",";
cout<<endl;
return 0;
}
插入排序:
#include<iostream>
using namespace std;
template<class T>
void insertSort(T a[],int n) //插入排序
{
intt;
for(inti=1;i<n;i++) //从数组的第二个元素开始与前边的进行比较,当前边的元素不大于该元素时插入该元素
{
t=a[i];
for(intj=i;j>0&&t<a[j-1];j--) //当前边的元素大于该元素时,前边的元素向后移一位
a[j]=a[j-1];
a[j]=t;
}
}
int main()
{
inta[8]={3,7,6,4,5,8,2,1};
insertSort(a,8);
for(inti=0;i<8;i++)
cout<<a[i]<<",";
cout<<endl;
return0;
}
选择排序:
#include<iostream>
using namespace std;
template<class T>
void selSort(T a[],int n)
{
intmin;
//反复n-1次
for(inti=0;i<n-1;i++)
{
min=i;
for(intj=i+1;j<n;j++)
if(a[j]<a[min])
min=j;
//把它跟第i个元素交换
swap(a[i],a[min]);
}
}
int main()
{
inta[8]={3,2,5,7,8,4,1,6};
selSort(a,8);
for(inti=0;i<8;i++)
cout<<a[i]<<",";
cout<<endl;
return0;
}
快速排序:
分治法
#include<iostream>
using namespace std;
template<class T>
int Partition(T a[],int p,int r)
{
inti=p,j=r+1;
Tx=a[p];
//将<x的元素交换到左边区域
//将>x的元素交换到右边区域
while(true)
{
while(a[++i]<x&&i<r); //当i位置的元素小于x的值则i位置向下移
while(a[--j]>x); //同理j位置向前移
//当i位置不大于j位置且i位置元素大于x且j位置元素小于x,则交换i和j位置的元素
if(i>=j)
break;
swap(a[i],a[j]);
}
a[p]=a[j];
a[j]=x;
returnj;
}
template<class T>
void QuickSort(T a[],int p,int r)
{
if(p<r)
{
intq=Partition(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
int main()
{
inta[8]={3,5,2,6,8,7,1,4};
QuickSort(a,0,7);
for(inti=0;i<8;i++)
cout<<a[i]<<",";
cout<<endl;
return0;
}