算法练习日志
一、折半查找(二分查找)
/**
*
*题目描述:
*利用二分查找算法查找数组中某个数
*/
#include <iostream>
using namespace std;
int binSearch(int a[],int low,int high,int num)
{
int mid;
if(low<high)
{
mid = (low+high)/2; //查找区间中间位置
if(a[mid]==num)
return mid;
if(a[mid]>num)
return binSearch(a,low,mid-1,num);
else
return binSearch(a,mid+1,high,num);
}
return -1;
}
int main()
{
int n;
cout<<"输入数组长度:";
cin>>n;
int a[n];
cout<<"输入数组(已排序):"<<endl;
for(int i=0;i<n;i++)
cin>>a[i];
int num;
cout<<"输入查找的数字:";
cin>>num;
int i =binSearch(a,0,n,num);
if(i>=0)
cout<<num<<" 的位置在 a["<<i<<"]"<<endl;
else
cout<<"未找到 "<<num<<endl;
return 0;
}
二、快速排序
/*
*题目描述:
*对数组进行快速排序
*/
#include <iostream>
using namespace std;
void display(int a[],int n)
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
int position(int a[],int s,int e)
{
int i =s,j =e;
int temp = a[s];
while(i!=j)
{
while(j>i&&a[j]>=temp)
j--;//从右向左扫描
a[i] = a[j];
while(i<j&&a[i]<=temp)
i++;
a[j] = a[i];
}
a[i] = temp;
return i;
}
void quickSort(int a[],int s,int e)
{ if(s<e)
{
//至少有两个元素,递归排序
int i = position(a,s,e);
quickSort(a,s,i-1);//左子树
quickSort(a,i+1,e);//右子树
}
}
int main()
{
int n;
cout<<"输入数组长度:";
cin>>n;
int a[n];
cout<<"输入数组(未排序):"<<endl;
for(int i=0;i<n;i++)
cin>>a[i];
quickSort(a,0,n-1);
cout<<"排序后数组:"<<endl;
display(a,n);
return 0;
}
三、增量穷举求幂集
/*增量穷举法求幂集O(2^n)
*题目描述:
*给出一个整数n,求1~n构成集合的幂集
**/
#include <iostream>
#include<vector>
using namespace std;
vector<vector<int>> ps;
void PSet(int n)
{
vector<vector<int>> ps1;
vector<vector<int>>::iterator it;
vector<int> s;
ps.push_back(s);
for(int i=1 ; i<=n;i++)
{ ps1=ps;
for(it = ps1.begin();it!=ps1.end();it++)
it->push_back(i);
for(it = ps1.begin();it!=ps1.end();it++)
ps.push_back(*it);
}
}
void displays()
{
vector<vector<int>>::iterator it;
vector<int>::iterator sit;
for(it = ps.begin();it!=ps.end();it++)
{ cout<<"{";
for(sit = it->begin();sit !=it->end();sit++)
cout<<*sit<<" ";
cout<<"}"<<endl;
}
}
int main()
{
int n;
cout<<"输入整数n:";
cin>>n;
PSet(n);
cout<<"1~"<<n<<"的幂集为:"<<endl;
displays();
return 0;
}
结果:
四、贪心算法(集装箱问题)
/*
*【问题描述】有n个集装箱要装上一艘载重量为W的轮船,其中集装箱i(l<i<n)的重量为w。
*不考虑集装箱的体积限制,现要选出尽可能多的集装箱装上轮船,使它们的重量之和不*超过W。
**/
#include <iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define MAXN 20 //最多集装箱个数
int w[] = {0,5,2,6,4,3}; //各箱子重量,忽略下标0的箱子
int n =5,W=10;
int maxW;
int x[MAXN];
void solve()
{
memset(x,0,sizeof(x));
sort(w+1,w+n+1); //w[1..n]递增排序
maxW =0;
int restw = W;
for(int i =1;i<=n&&w[i]<=restw;i++)
{
x[i]=1; //选择集装箱i
restw-=w[i]; //减少剩余重量
maxW+=w[i]; //累计装载总质量
}
}
int main()
{
solve();
cout<<"最优方案:"<<endl;
for(int i=0;i<=n;i++)
if(x[i]==1)
cout<<"选集装箱"<<i<<" 重量"<<w[i]<<endl;
cout<<"总重量:"<<maxW<<endl;
return 0;
}
运行结果: